3

我有一个全局异常处理程序例程,它在运行时异常中包装了一些异常

像这样

public class ExceptionHandler
{
public static void handle(){
    throw new RuntimeException(e);
}
}

ExceptionHandler课堂上我也有一个静态构造函数

static
  {
    Thread.UncaughtExceptionHandler h = new Thread.UncaughtExceptionHandler()
    {
      @Override
      public void uncaughtException(Thread thread, Throwable throwable)
      {
        Throwable t;
        t = throwable;
        if (throwable.getCause() != null)
          t = throwable.getCause();
        Log.e(t.getClass().getName(), t.getMessage(), t);
      }
    };
    Thread.currentThread().setUncaughtExceptionHandler(h);
    Thread.setDefaultUncaughtExceptionHandler(h);
  }

问题是,投掷 RTE 后它不会进入UncaughtExceptionHandler. 为什么?

顺便说一句,我不能把它放到 main 方法中,因为我的 Android 程序中没有 main 。

4

2 回答 2

1

您可以继承 Application 类并初始化您的ExceptionHandlerinonCreate()方法。

public class YourApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler());
    }
}

并在那里实现你的异常处理程序

private class ExceptionHandler implements Thread.UncaughtExceptionHandler {
    @Override
    public void uncaughtException(Thread thread, Throwable throwable) {
        processUncaughtException(thread, throwable);
    }
}

您可能还想维护默认的异常处理程序,以便在设置它之前执行它

defaultExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
于 2013-01-10T09:59:05.033 回答
0

初始化程序块仅在staticClassLoader 加载类时执行。我不是 Android 专家,但我认为您可以在主活动类中初始化异常处理程序。只需像这里一样使用静态初始化块或使用Activity生命周期方法,如onCreate. Leonidos在这里建议的另一个选项可能最适合这种初始化:扩展Application class并把你的代码放在那里。

于 2013-01-10T09:59:37.613 回答