2013-08-26 34 views
2

我想记录自己的错误后故意使应用程序崩溃。处理程序在Application.onCreate()中注册:Thread.setDefaultUncaughtExceptionHandler中的应用程序崩溃

// set global exception handler 
Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() { 
@Override 
public void uncaughtException(Thread thread, final Throwable ex) { 
    // unregister 
    Thread.setDefaultUncaughtExceptionHandler(null); 

    // do report ... 

    // crash app -does not work, app is frozen 
    if (ex instanceof RuntimeException) 
    throw (RuntimeException) ex; 
    throw new RuntimeException("Re-throw", ex); 
} 

但是,我的应用程序冻结而不是与对话框崩溃。如果我没有注册处理程序,我该如何崩溃应用程序?

+0

似乎取消注册应该在匿名类别外 – aim

+0

您期望发生什么?当你“重新抛出”时,你已经消除了任何默认的异常处理,并且你应该期待你的应用在这一点上很难崩溃。 – chrylis

+0

@chrylis正是我想要的 - 但它不会崩溃,它冻结,甚至不显示ANR。 – Flo

回答

5

这段代码永远不会工作。

未被捕获的异常处理程序在之后被调用由于未捕获到异常,线程已终止。如果你试图重新抛出异常,那么就没有别的办法了。

  • 如果您想要在正常情况下处理重新抛出的异常,则必须在堆栈中进一步执行日志记录。

  • 您唯一的其他选择是明确链到另一个UncaughtExceptionHandler


嫌疑这是你所遇到的冻结是当前线程死亡的直接后果。


跟帖:

...有没有在Android的一些其他的方式来拦截在全球范围内的异常,而无需使用Thread.setDefaultUncaughtExceptionHandler?

AFAIK,no。

或者链接是怎样的?

事情是这样的:

public void uncaughtException(Thread thread, final Throwable ex) { 
    // do report ... 

    getSomeOtherHandler(...).uncaughtException(thread, ex); 
} 

或者,因为线程组实现UncaughtExceptionHandler,...

public void uncaughtException(Thread thread, final Throwable ex) { 
    // do report ... 

    thread.getThreadGoup().uncaughtException(thread, ex); 
} 

基本上,你只需要调用一些其他的处理程序。这不是火箭科学。

但是请注意,一旦您登陆这些处理程序之一,就无法从“正常”方式的异常中捕获和恢复。

+0

感谢这个信息 - 在没有使用'Thread.setDefaultUncaughtExceptionHandler'的情况下,Android是否有一些其他的方法来拦截全局级别的异常?或者链接如何? – Flo