Android异常处理最佳实践?

新手上路,请多包涵

如果我的应用程序崩溃,它会挂起几秒钟,然后 Android 会告诉我应用程序崩溃并需要关闭。所以我想用一般的方法捕获我的应用程序中的所有异常:

 try {
    // ...
} catch(Exception e) {
    // ...
}

并制作一个新的 Activity 解释应用程序立即崩溃(并让用户有机会发送包含错误详细信息的邮件),而不是由于 Android 而造成延迟。有没有更好的方法来完成这个或者这是气馁?

更新: 我使用的是启用了 ART 的 Nexus 5,我没有注意到我曾经遇到过应用程序崩溃的延迟(我最初所说的“挂起”)。我认为由于现在一切都是本机代码,所以崩溃会立即发生并获取所有崩溃信息。也许 Nexus 5 只是很快 :) 不管怎样,在未来的 Android 版本中这可能不是一个担心(假设 ART 将成为 Android L 中的默认运行时)。

原文由 ldam 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 306
2 个回答

在这里,检查 链接以供参考

在这里你创建一个类说 ExceptionHandler implements java.lang.Thread.UncaughtExceptionHandler ..

在本课程中,您将做一些拯救生命的事情,例如创建堆栈跟踪并准备好上传错误报告等……

现在是重要的部分,即如何捕获该异常。虽然很简单。在重写的 onCreate 方法中调用超级方法之后,在每个 Activity 中复制以下代码行。

 Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler(this));

您的 Activity 可能看起来像这样……

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

        Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler(this));

        setContentView(R.layout.main);
    }
}

原文由 CRUSADER 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以只使用通用警报对话框来快速显示错误消息。例如…

 //******************************************
//some generic method
//******************************************
private void doStuff()
{
    try
    {
        //do some stuff here
    }
    catch(Exception e)
    {
        messageBox("doStuff", e.getMessage());
    }
}

//*********************************************************
//generic dialog, takes in the method name and error message
//*********************************************************
private void messageBox(String method, String message)
{
    Log.d("EXCEPTION: " + method,  message);

    AlertDialog.Builder messageBox = new AlertDialog.Builder(this);
    messageBox.setTitle(method);
    messageBox.setMessage(message);
    messageBox.setCancelable(false);
    messageBox.setNeutralButton("OK", null);
    messageBox.show();
}

您还可以在此方法中添加其他错误处理选项,例如 print stacktrace

原文由 Louis Evans 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题