文章目录
自己实现异常处理器
- 自己实现异常处理器
- 编写自己的MyUncaughtExceptionHanlder
- 使用自己的UncaughtExceptionHandler
自己实现异常处理器有三种方式 :
- 程序统一设置
- 每个线程单独设置
- 每个线程池单独设置
一般开发中使用第一个, 2和3除非有特殊的需求, 可以做.
编写自己的MyUncaughtExceptionHanlder编写自己的MyUncaughtExceptionHanlder代码如下. 主要是MyUncaughtExceptionHandler 实现了Thread类的 Thread.UncaughtExceptionHandler接口. 重写了uncaughtException 方法. 在此方法类, 可以对线程的异常做一些操作. 例如在生产环境中 , 可以记录异常日志. 把异常报警信息给异常系统, 让工作人员知道发生了异常. 此处只是打印了线程和异常信息 同时设置了一个成员变量, 用于设置 异常捕获器的名称.
package com.thread.uncaughtexception;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* 类名称:MyUncaughtExceptionHandler
* 类描述: 自己的线程异常处理器
*
* @author: https://javaweixin6.blog.csdn.net/
* 创建时间:2020/8/30 19:43
* Version 1.0
*/
public class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {
// 异常处理器的名字
private String name;
public MyUncaughtExceptionHandler(String name) {
this.name = name;
}
@Override
public void uncaughtException(Thread thread, Throwable e) {
Logger logger = Logger.getAnonymousLogger();
logger.log(Level.WARNING," 线程异常,终止"+thread.getName(),e);
System.out.println(name +"捕获了异常" + thread.getName()+"异常"+e);
}
}
使用自己的UncaughtExceptionHandler
如下的代码中, 使用了自己的UncaughtExceptionHandler . 从而不需要任何一行的try catch代码.
主要的代码为设置了自己的异常处理器Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler("线程异常捕获器"));
package com.thread.uncaughtexception;
/**
* 类名称:UseOwnUncaughtExceptionHandler
* 类描述: 使用自己的UncaughtExceptionHandler
*
* @author: https://javaweixin6.blog.csdn.net/
* 创建时间:2020/8/30 19:48
* Version 1.0
*/
public class UseOwnUncaughtExceptionHandler implements Runnable {
public static void main(String[] args) throws InterruptedException {
Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler("线程异常捕获器"));
new Thread(new UseOwnUncaughtExceptionHandler(),"MyThread-1").start();
Thread.sleep(300);
new Thread(new UseOwnUncaughtExceptionHandler(),"MyThread-2").start();
Thread.sleep(300);
new Thread(new UseOwnUncaughtExceptionHandler(),"MyThread-3").start();
Thread.sleep(300);
new Thread(new UseOwnUncaughtExceptionHandler(),"MyThread-4").start();
}
@Override
public void run() {
throw new RuntimeException();
}
}
控制台打印如下 , 成功的捕获了异常, 并且打印了异常信息.