- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我问了this一段时间后在 Stackoverflow
上提问,答案对我有用,它覆盖了 handleUncaughtException
,我保存异常并抛出默认值 Unfortunately app has stopped working
,但是当我将它集成到我的应用程序中时,我遇到了一个问题。
这就是我得到的答案。
private Thread.UncaughtExceptionHandler defaultExceptionHandler;
public void registerCrash(){
defaultExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler (new Thread.UncaughtExceptionHandler(){
@Override
public void uncaughtException (Thread thread, Throwable e){
handleUncaughtException (thread, e);
if(defaultExceptionHandler != null){
defaultExceptionHandler.uncaughtException(thread, e);
}
}
});
}
它做什么,首先它转到handleUncaughtException (thread, e);
我用这个方法保存崩溃日志,然后它读取这一行
if(defaultExceptionHandler != null){
defaultExceptionHandler.uncaughtException(thread, e);
}
这里我们再次抛出未捕获的异常,所以它再次进入第一行,再次保存异常,如此循环,应用程序变得没有响应。
我想要的是保存崩溃日志,然后向用户显示默认的 Unfortunate
消息。
编辑
在应用程序启动时,它会读取此内容;
defaultExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
当应用程序崩溃时,它会读取这些行
Thread.setDefaultUncaughtExceptionHandler (new Thread.UncaughtExceptionHandler(){
@Override
public void uncaughtException (Thread thread, Throwable e){
handleUncaughtException (thread, e); //Custom Method
if(defaultExceptionHandler != null){
defaultExceptionHandler.uncaughtException(thread, e);
}
}
所以它首先转到 handleUncaughtException()
那里我提供了自定义实现,然后转到这里;
if(defaultExceptionHandler != null){
defaultExceptionHandler.uncaughtException(thread, e);
}
defaultExceptionHandler
永远不会为 null;所以它会在多次崩溃的情况下进入循环。
我尝试在那里添加 count
,但每次都是 0
。
最佳答案
最可能的解释是您的 registerCrash()
方法被调用了两次。
第一次,你注册了Handler 1
;此时没有默认处理程序,因此它将 defaultExceptionHandler
设置为 null
。第二次,您注册了 Handler 2
,然后更新 defaultExceptionHandler
以指向 Handler 1
。
在未捕获的异常中,Handler 2
首先被调用。它调用您的自定义处理程序方法,然后调用 defaultExceptionHandler
,它现在指向 Handler 1
。
Handler 1
被调用。它第二次调用您的自定义处理程序方法,然后调用 defaultExceptionHandler
,现在指向它自己。重复此步骤,直到您的堆栈溢出。
我建议进行两处更改。首先,添加一个守卫以确保您只注册一次崩溃处理程序。其次,不要将回退处理程序存储在字段中;在闭包中捕获它,这样您的处理程序看到的值就不会改变。
private static final AtomicBoolean CRASH_HANDLER_REGISTERED = new AtomicBoolean();
public void registerCrash() {
if (CRASH_HANDLER_REGISTERED.compareAndSet(false, true)) {
final Thread.UncaughtExceptionHandler defaultHandler =
Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(
new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, Throwable e) {
handleUncaughtException(thread, e); // Custom Method
if (defaultHandler != null) {
defaultHandler.uncaughtException(thread, e);
}
}
}
);
}
}
关于android - 如何在不更改其功能的情况下覆盖处理未捕获的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45402231/
我是一名优秀的程序员,十分优秀!