Java 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. Почему?

Кстати, я не могу поместить его в основной метод, потому что в моей программе для Android нет основного.


person cdbeelala89    schedule 10.01.2013    source источник
comment
см. здесь   -  person linski    schedule 10.01.2013
comment
Я думаю, что код в статическом блоке не выполняется, потому что ExceptionHandler не запускается, потому что никто не использует класс ExceptionHandler. прочитайте этот пост. Вы можете расширить класс android Application и поместить туда этот код, класс Application ' конструктор является неким аналогом функции main.   -  person Leonidos    schedule 10.01.2013


Ответы (2)


Вы можете создать подкласс класса 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();
person Taras Leskiv    schedule 10.01.2013

Блок инициализатора static выполняется только тогда, когда класс загружается ClassLoader. Я не эксперт в Android, но я думаю, что вы можете инициализировать обработчик исключений в своем основном классе активности. Просто используйте статический блок инициализатора, как здесь, или используйте методы жизненного цикла Activity, такие как onCreate. Существует также другой вариант, предложенный здесь Leonidos, который может быть лучшим для такого типа инициализации: расширьте Application class и поместите свой код там.

person bruno conde    schedule 10.01.2013