问题

可以先只抛出第一问,等得到 Thread.UncaughtExceptionHandler 的答案之后再抛出第二问

修改了一下措辞,把捕获异常改成捕获 Crash。说异常感觉默认就是 Exception 了,容易把题目带歪。

第一问:

如何捕获到所有 Java 层的 Crash?

第二问:

try{
    ...
}catch (Exception e){
    ...
}

在上述语法下,try 中的代码块如果发生 Crash,Thread.UncaughtExceptionHandler 可以捕获到么?

答案

第一答:

通过实现 Thread.UncaughtExceptionHandler 接口,就可以获取到所有 java 层的 Crash。神策 SDK 中 SensorsDataExceptionHandler 类正是通过这种方式采集「App 崩溃」事件。

第二答:

如果 try 中抛出的是 Exception,那么会被自己的 catch 语句处理而不会被 Thread.UncaughtExceptionHandler 捕获;

如果 try 中抛出的是 Throwable 或者 Error ,那么 catch 语句无法被捕获,异常会被 Thread.UncaughtExceptionHandler 捕获。

在 Java 中,所有的异常都有一个共同的父类 Throwable,Throwable 有两个重要的子类:Exception 和 Error ,二者都是 Java 异常处理的重要子类。

Exception 是应用程序中可能的可预测、可恢复问题。一般大多数异常表示中度到轻度的问题。异常一般是在特定环境下产生的,通常出现在代码的特定方法和操作中,例如喜闻乐见的 java.lang.NullPointerException~

Error 表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如当一个应用递归调用的层次太深而导致堆栈溢出时抛出该错误:java.lang.StackOverflowError。

 

每日一问的答案中可能无法全完解读这个问题,如果您是相关技术专家或者是对本问题有自己的见解,欢迎带着「批判性」的态度阅读,指正其中的不足。