Android 拦截未处理的异常
Android Intercept Unhandled Exceptions
所以我想拦截未处理的异常,我这样做的方式是:
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
//MY CUSTOM CODE TO SEND LOGS
System.exit(2);
}
});
我是否可以执行我的自定义代码,然后恢复它处理这些异常的正常方式?我相信我遇到了一些悬而未决的问题,因为 System.exit
似乎无法可靠地工作。
您必须先获取默认处理程序。然后拦截并将错误发送给处理程序。 System.exit...是个坏主意。
因此,首先像您一样创建一个自定义异常处理程序:
public class CustomExceptionHandler implements Thread.UncaughtExceptionHandler {
private final Thread.UncaughtExceptionHandler defaultUEH;
public CustomExceptionHandler(Thread.UncaughtExceptionHandler defaultUEH) {
this.defaultUEH = defaultUEH;
}
@Override
public void uncaughtException(Thread thread, Throwable ex) {
String stackTrace = Log.getStackTraceString(ex);
String time = new Date(System.currentTimeMillis()).toString();
String message = ex.getMessage();
// send logs...
defaultUEH.uncaughtException(thread, ex);
}
}
所以基本上在你的 onCreate 方法中(最好在自定义应用程序中使用 class 让它落在所有部分)如果尚未设置默认异常处理程序(在应用程序中检查不需要):
Thread.UncaughtExceptionHandler defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
if (!(defaultUEH instanceof CustomExceptionHandler)) {
Thread.setDefaultUncaughtExceptionHandler(new CustomExceptionHandler(defaultUEH));
}
我写的here(去掉BuildConfig.DEBUG勾选)实现直接启动邮件客户端。如果没有安装电子邮件客户端,你应该赶上 ActivityNotFoundException
.
所以我想拦截未处理的异常,我这样做的方式是:
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
//MY CUSTOM CODE TO SEND LOGS
System.exit(2);
}
});
我是否可以执行我的自定义代码,然后恢复它处理这些异常的正常方式?我相信我遇到了一些悬而未决的问题,因为 System.exit
似乎无法可靠地工作。
您必须先获取默认处理程序。然后拦截并将错误发送给处理程序。 System.exit...是个坏主意。
因此,首先像您一样创建一个自定义异常处理程序:
public class CustomExceptionHandler implements Thread.UncaughtExceptionHandler {
private final Thread.UncaughtExceptionHandler defaultUEH;
public CustomExceptionHandler(Thread.UncaughtExceptionHandler defaultUEH) {
this.defaultUEH = defaultUEH;
}
@Override
public void uncaughtException(Thread thread, Throwable ex) {
String stackTrace = Log.getStackTraceString(ex);
String time = new Date(System.currentTimeMillis()).toString();
String message = ex.getMessage();
// send logs...
defaultUEH.uncaughtException(thread, ex);
}
}
所以基本上在你的 onCreate 方法中(最好在自定义应用程序中使用 class 让它落在所有部分)如果尚未设置默认异常处理程序(在应用程序中检查不需要):
Thread.UncaughtExceptionHandler defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
if (!(defaultUEH instanceof CustomExceptionHandler)) {
Thread.setDefaultUncaughtExceptionHandler(new CustomExceptionHandler(defaultUEH));
}
我写的here(去掉BuildConfig.DEBUG勾选)实现直接启动邮件客户端。如果没有安装电子邮件客户端,你应该赶上 ActivityNotFoundException
.