Java uncaughtExceptionHandler无法正常工作

时间:2013-01-10 09:49:54

标签: java android exception runtimeexception uncaughtexceptionhandler

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

喜欢这个

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。

2 个答案:

答案 0 :(得分:1)

您可以继承Application类并在ExceptionHandler方法中初始化onCreate()

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();

答案 1 :(得分:0)

只有在ClassLoader加载类时才会执行static初始化程序块。我不是Android的专家,但我认为你可以在主活动类中初始化异常处理程序。只需像使用此处一样使用静态初始化程序块,或使用ActivityonCreate生命周期方法。 Leonidos此处还提供了另一个可能最适合此类初始化的选项:扩展Application class并将代码放在那里。