线程 Thread.UncaughtExceptionHandler 异常捕获

setUncaughtExceptionHandler

public void setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)
x

1

public void setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)

设置该线程由于未捕获到异常而突然终止时调用的处理程序。

通过明确设置未捕获到的异常处理程序,线程可以完全控制它对未捕获到的异常作出响应的方式。

如果没有设置这样的处理程序,则该线程的 ThreadGroup 对象将充当其处理程序。

public Thread.UncaughtExceptionHandler getUncaughtExceptionHandler()

1

public Thread.UncaughtExceptionHandler getUncaughtExceptionHandler()

返回该线程由于未捕获到异常而突然终止时调用的处理程序。

如果该线程尚未明确设置未捕获到的异常处理程序,则返回该线程的 ThreadGroup 对象,除非该线程已经终止,在这种情况下,将返回 null。

setDefaultUncaughtExceptionHandler

public static void setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)
x

1

public static void setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)

设置当线程由于未捕获到异常而突然终止,并且没有为该线程定义其他处理程序时所调用的默认处理程序。

未捕获到的异常处理首先由线程控制,然后由线程的 ThreadGroup 对象控制,最后由未捕获到的默认异常处理程序控制。

如果线程不设置明确的未捕获到的异常处理程序,并且该线程的线程组(包括父线程组)未特别指定其 uncaughtException 方法,则将调用默认处理程序的 uncaughtException 方法。

通过设置未捕获到的默认异常处理程序,应用程序可以为那些已经接受系统提供的任何“默认”行为的线程改变未捕获到的异常处理方式(如记录到某一特定设备或文件)。

请注意,未捕获到的默认异常处理程序通常不应顺从该线程的 ThreadGroup 对象,因为这可能导致无限递归。

public static Thread.UncaughtExceptionHandler getDefaultUncaughtExceptionHandler()

1

public static Thread.UncaughtExceptionHandler getDefaultUncaughtExceptionHandler()

返回线程由于未捕获到异常而突然终止时调用的默认处理程序。如果返回值为 null,则没有默认处理程序。

Thread.UncaughtExceptionHandler

public static interface Thread.UncaughtExceptionHandler

1

public static interface Thread.UncaughtExceptionHandler

所有已知实现类:ThreadGroup

当 Thread 因未捕获的异常而突然终止时,调用处理程序的接口。

当某一线程因未捕获的异常而即将终止时,Java 虚拟机将使用 Thread.getUncaughtExceptionHandler() 查询该线程以获得其 UncaughtExceptionHandler 的线程,并调用处理程序的 uncaughtException 方法,将线程和异常作为参数传递。

如果某一线程没有明确设置其 UncaughtExceptionHandler,则将它的 ThreadGroup 对象作为其 UncaughtExceptionHandler。如果 ThreadGroup 对象对处理异常没有什么特殊要求,那么它可以将调用转发给默认的未捕获异常处理程序。

void uncaughtException(Thread t, Throwable e) 
x

1

void uncaughtException(Thread t, Throwable e) 

当给定线程因给定的未捕获异常而终止时,调用该方法。

Java 虚拟机将忽略该方法抛出的任何异常。

测试案例

public class Test {
	public static void main(String[] args) {
		setDefaultUncaughtExceptionHandler();
		test();
	}

	private static void test() {
		new Thread(new Runnable() {
			@Override
			public void run() {
				System.out.println("子线程异常前");
				System.out.println(1 / 0);
			}
		}).start();
		System.out.println("当前线程异常前");
		System.out.println(1 / 0);
		System.out.println("异常后的代码不能执行了");
	}

	private static void setDefaultUncaughtExceptionHandler() {
		UncaughtExceptionHandler currentHandler = new UncaughtExceptionHandler() {
			@Override
			public void uncaughtException(Thread t, Throwable e) {
				System.out.println("【当前线程的Handler处理异常信息】" + t.toString() + "\n" + e.getMessage());
			}
		};
		UncaughtExceptionHandler defaultHandler = new UncaughtExceptionHandler() {
			@Override
			public void uncaughtException(Thread t, Throwable e) {
				StringWriter writer = new StringWriter();
				PrintWriter printWriter = new PrintWriter(writer);
				printWriter.write("start------------\n");
				e.printStackTrace(printWriter);
				printWriter.write("------------end");
				printWriter.close();
				System.out.println("【默认的Handler处理异常信息】" + writer.getBuffer().toString());
			}
		};
		Thread.currentThread().setUncaughtExceptionHandler(currentHandler);
		Thread.setDefaultUncaughtExceptionHandler(defaultHandler);
	}
}

1

public class Test {

2

    public static void main(String[] args) {

3

        setDefaultUncaughtExceptionHandler();

4

        test();

5

    }

6


7

    private static void test() {

8

        new Thread(new Runnable() {

9

            @Override

10

            public void run() {

11

                System.out.println("子线程异常前");

12

                System.out.println(1 / 0);

13

            }

14

        }).start();

15

        System.out.println("当前线程异常前");

16

        System.out.println(1 / 0);

17

        System.out.println("异常后的代码不能执行了");

18

    }

19


20

    private static void setDefaultUncaughtExceptionHandler() {

21

        UncaughtExceptionHandler currentHandler = new UncaughtExceptionHandler() {

22

            @Override

23

            public void uncaughtException(Thread t, Throwable e) {

24

                System.out.println("【当前线程的Handler处理异常信息】" + t.toString() + "\n" + e.getMessage());

25

            }

26

        };

27

        UncaughtExceptionHandler defaultHandler = new UncaughtExceptionHandler() {

28

            @Override

29

            public void uncaughtException(Thread t, Throwable e) {

30

                StringWriter writer = new StringWriter();

31

                PrintWriter printWriter = new PrintWriter(writer);

32

                printWriter.write("start------------\n");

33

                e.printStackTrace(printWriter);

34

                printWriter.write("------------end");

35

                printWriter.close();

36

                System.out.println("【默认的Handler处理异常信息】" + writer.getBuffer().toString());

37

            }

38

        };

39

        Thread.currentThread().setUncaughtExceptionHandler(currentHandler);

40

        Thread.setDefaultUncaughtExceptionHandler(defaultHandler);

41

    }

42

}

运行结果

子线程异常前
当前线程异常前
【当前线程的Handler处理异常信息】Thread[main,5,main]
/ by zero
【默认的Handler处理异常信息】start------------
java.lang.ArithmeticException: / by zero
	at Test$1.run(Test.java:16)
	at java.lang.Thread.run(Thread.java:745)
------------end

1

子线程异常前

2

当前线程异常前

3

【当前线程的Handler处理异常信息】Thread[main,5,main]

4

/ by zero

5

【默认的Handler处理异常信息】start------------

6

java.lang.ArithmeticException: / by zero

7

    at Test$1.run(Test.java:16)

8

    at java.lang.Thread.run(Thread.java:745)

9

------------end

2018-5-31

原文地址:https://www.cnblogs.com/baiqiantao/p/79bf1e7f0803557c9195acec7af1e244.html

时间: 2024-08-30 02:08:56

线程 Thread.UncaughtExceptionHandler 异常捕获的相关文章

JAVA 线程中的异常捕获

在java多线程程序中,所有线程都不允许抛出未捕获的checked exception(比如sleep时的InterruptedException),也就是说各个线程需要自己把自己的checked exception处理掉.这一点是通过java.lang.Runnable.run()方法声明(因为此方法声明上没有throw exception部分)进行了约束.但是线程依然有可能抛出unchecked exception(如运行时异常),当此类异常跑抛出时,线程就会终结,而对于主线程和其他线程完全

Android Thread.UncaughtExceptionHandler异常消息捕获

public void uncaughtException(Thread thread, Throwable ex) { //处理异常 Log.e("崩溃",thread.getName()+ex.toString()); //发送到服务器 //dialog提醒 } 重写Application的onTerminate() 关闭整个程序后做的来操作:

JAVA并发,线程异常捕获

由于线程的特性,当我们启动了线程是没有办法用try catch捕获异常的,如下例: 1 package com.xt.thinks21_2; 2 3 import java.util.concurrent.ExecutorService; 4 import java.util.concurrent.Executors; 5 6 /** 7 * 线程异常捕获测试 8 * 9 * @author xue 10 * 11 */ 12 public class ThreadUncaughtExcepti

捕获线程中的异常

由于线程的本质特性,使得你不能捕获从线程中逃逸的异常.一旦异常逃出任务的run()方法它就会向外传播到控制台,除非你采取特殊的步骤捕获这种错误的异常.在Java SE5之前,你可以使用线程组来捕捉这种异常,但是有了Java SE5,就可以用Executor来解决这个问题了. 下面的任务总是会抛出一个异常,该异常会传播到其run()方法的外部,并且main()展示了当你运行它时所发生的事情: import java.util.concurrent.ExecutorService; import j

多线程捕获线程中的异常

Thread类最佳实践: 写的时候最好要设置线程名称 Thread.name,并设置线程组 ThreadGroup,目的是方便管理.在出现问题的时候,打印线程栈 (jstack -pid) 一眼就可以看出是哪个线程出的问题,这个线程是干什么的. 二种实现方式 方法一 Thread方式通过线程组,线程名,并设置UncaughtExceptionHandler来捕获异常 public static void main(String[] args) { try{ Thread t =new Threa

为什么用线程的UncaughtExceptionHandler处理异常 -> Java: Handl

package com.doctor.java8; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; /**  * 为什么用线程的UncaughtExceptionHandler处理异常 ->

android开发步步为营之57:UncaughtExceptionHandler未捕获的异常处理器

写程序的时候,大部分的时候,我们都会知道添加try,catch的代码块,比如 try { mRoot = inflater.inflate(R.layout.fragment_setting, container, false); initView(mRoot); } catch (Exception e) { log.error("SettingFragment", e); } catch (OutOfMemoryError e) { log.error("SettingF

【IOS】异常捕获 拒绝闪退 让应用从容的崩溃 UncaughtExceptionHandler

虽然大家都不愿意看到程序崩溃,但可能崩溃是每个应用必须面对的现实,既然崩溃已经发生,无法阻挡了,那我们就让它崩也崩得淡定点吧. IOS SDK中提供了一个现成的函数 NSSetUncaughtExceptionHandler 用来做异常处理,但功能非常有限,而引起崩溃的大多数原因如:内存访问错误,重复释放等错误就无能为力了,因为这种错误它抛出的是Signal,所以必须要专门做Signal处理.首先定义一个UncaughtExceptionHandler类,代码如下: #import <Found

扩展BindingList,防止增加、删除项时自动更新界面而不出现“跨线程操作界面控件 corss thread operation”异常

在做界面程序时,常常需要一些数据类,界面元素通过绑定等方式显示出数据,然而由于UI线程不是线程安全的,一般都需要通过Invoke等方式来调用界面控件.但对于数据绑定bindingList而言,没法响应listchang事件,导致后端的grid等控件不能更新数据.废了好大的劲终于找到一个UIBindingList,实现线程数据的同步! using System; using System.ComponentModel; using System.Threading; using System.Wi