Использование глобальной обработки исключений с помощью "setUncaughtExceptionHandler" и "Toast"

Я пытаюсь создать простой обработчик исключений, который поможет мне отладить приложение. Прямо сейчас, когда у меня есть исключение, я вынужден подключиться к отладчику Eclipse просто, чтобы увидеть подробности об исключении.

Чтобы избежать этого, я использовал setUncaughtExceptionHandler для обработки любого необработанного исключения и отображения Toast для исключения. К сожалению, это не работает.

public class TicTacToe extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Thread.currentThread().setUncaughtExceptionHandler(new UncaughtExceptionHandler() {

            @Override
            public void uncaughtException(Thread thread, Throwable ex) {
                Toast.makeText(TicTacToe.this, "TOAST", Toast.LENGTH_LONG).show();
            }
        });

        setContentView(R.layout.main);

        Button continueButton = (Button) findViewById(R.id.cell01);
        continueButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                int i = 5;
                i = 5 / 0;

                Toast.makeText(TicTacToe.this, "BUTTON", Toast.LENGTH_LONG).show();             
            }
        });

    }
}

По сути, я сделал форму с помощью одной кнопки, нажав на которую, она выкинула бы исключение из-за нуля. Однако нажатие кнопки не приводит к отображению глобального обработчика тоста. Вместо этого кнопка остается оранжевой (нажата), и ничего не происходит.

Излишне говорить, что если я прокомментирую я = 5/0;, я вижу тост, который говорит, что нажата кнопка.

Два вопроса: 1) Почему не отображается тост в теге UncaughtExceptionHandler? Как заставить его показать? 2) Существует ли альтернативный/лучший способ для обработки глобальных исключений? Я предполагаю, что смогу установить aLogCat на симулятор Android и просто зарегистрировать неперехваченное исключение, но, тем не менее, он менее удобен - мне нужно будет переключать приложения, чтобы увидеть детали исключений.

Спасибо!

Ответ 1

Вы ничего не видите, потому что исключение произошло в вашем потоке пользовательского интерфейса, и стек полностью развернут. Таким образом, больше нет Looper, и там нет поддержки, которая используется для отображения Toast. Если вы хотите отобразить информацию об исключении на экране, скорее всего, вам нужно будет запустить другое действие в другом процессе.

Также существует проблема с вашим UncaughtExceptionHandler. Вы действительно должны хранить ссылку на старую и называть ее в конце uncaughtException, что позволяет системе отображать кнопку "Закрыть".

Ответ 2

Это возможно. Вам нужно сделать это в другом потоке
Тогда это должно быть как

    Thread.currentThread().setUncaughtExceptionHandler(new UncaughtExceptionHandler() {

        @Override
        public void uncaughtException(Thread thread, Throwable ex) {
            new Thread() {
                @Override
                public void run() {
                    Looper.prepare();  
                    Toast.makeText(TicTacToe.this, "TOAST", toast.LENGTH_LONG).show();
                    Looper.loop();
                }
            }.start();
        }
    });

Ответ 3

Я знаю, что это старый вопрос, но я надеюсь, что смогу спасти кого-то от разочарования и тратить время.

Qberticus прав, вы не можете запустить Activity в том же процессе, но вы можете убить текущий процесс и запустить Android в новом:

Intent intent = new Intent(myContext, AnotherActivity.class);
intent.putExtra("error", errorReport.toString());
myContext.startActivity(intent);

android.os.Process.killProcess(android.os.Process.myPid());
System.exit(10);

обратитесь к этой странице за потрясающий рабочий пример: