使用"setUncaughtExceptionHandler"和"Toast"进行全局异常处理

Vit*_*lyB 11 java android exception-handling exception

我正在尝试创建一个简单的异常处理程序,它将帮助我调试应用程序.现在,当我遇到异常时,我被迫连接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();             
            }
        });

    }
}
Run Code Online (Sandbox Code Playgroud)

基本上我用一个按钮制作了一个表单,按下它,它将抛出一个零度异常.但是,按下按钮不会导致显示全局Toast处理程序.相反,按钮保持橙色(按下),没有任何反应.

不用说,如果我评论出i = 5/0; 我看到吐司说按了一个按钮.

两个问题:1)为什么在UncaughtExceptionHandler体中没有显示toast ?怎么导致它显示?2)是否有替代/更好的全局异常处理方式?我想我可以在android模拟器上安装aLogCat并简单地记录未捕获的异常,但似乎不太舒服 - 我需要切换应用程序只是为了查看异常细节.

谢谢!

Lab*_*lan 14

有可能的.你需要在另一个线程内执行它
然后它应该是这样的

    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();
        }
    });
Run Code Online (Sandbox Code Playgroud)

  • 将启动另一个活动将使用此??? 它显示我黑屏 (2认同)

Ric*_*ler 11

您没有看到任何内容,因为您的UI线程上发生了异常,并且堆栈一直展开.所以没有更多的Looper,并且没有用于显示Toast的支持.如果要在屏幕上显示异常信息,则很可能需要在另一个进程中启动另一个Activity.

您的UncaughtExceptionHandler也存在问题.你真的应该保留对旧的引用并在结束时调用它uncaughtException允许系统显示强制关闭按钮.

  • Qberticus:"你很可能需要在另一个进程中启动另一个Activity."......我找不到怎么做!我用Google搜索了一下,没有成功.你能发一些代码吗? (3认同)