代码之家  ›  专栏  ›  技术社区  ›  VitalyB

对“setUncaughtExceptionHandler”和“Toast”使用全局异常处理

  •  11
  • VitalyB  · 技术社区  · 14 年前

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

    基本上,我用一个按钮做了一个窗体,按下这个按钮,它会抛出一个零例外的除法。但是,按下按钮不会导致全局toast处理程序显示。相反,按钮保持橙色(按下),什么也没发生。

    i=5/0; 我看到祝酒词上说有个按钮被按下了。

    两个问题: 1) 为什么祝酒词没有出现在大厅里 未捕获异常处理程序 尸体?你是怎么让它显现出来的? 2) 是否有其他/更好的全局异常处理方法?我想我可以在android模拟器上安装aLogCat并简单地记录未捕获的异常,然而,似乎不太舒服-我需要切换应用程序来查看异常细节。

    3 回复  |  直到 14 年前
        1
  •  11
  •   Rich Schuler    14 年前

    你看不到任何东西,因为异常发生在你的UI线程上,堆栈一直展开。因此没有更多的循环器,也没有用于显示Toast的支持。如果您想在屏幕上显示异常信息,您很可能需要在另一个进程中启动另一个活动。

    您的UncaughtExceptionHandler也有问题。你真的应该保留一个旧的引用并在结尾处调用它 uncaughtException 这允许系统显示强制关闭按钮。

        2
  •  14
  •   Labeeb Panampullan    13 年前


    那应该是这样的

        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
  •  1
  •   Iman Akbari    8 年前

    我知道这是一个老问题,但我希望我能拯救别人从挫折和浪费时间。

    Qberticus是对的,你不能在同一个进程上启动一个活动,但你可以终止当前进程,让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);
    

    参考 this page