【问题标题】:Android exception handling best practice?Android异常处理最佳实践?
【发布时间】:2013-05-09 19:50:37
【问题描述】:

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

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

并创建一个新的Activity,说明应用程序立即崩溃(并且还让用户有机会发送包含错误详细信息的邮件),而不是由于 Android 出现延迟。有没有更好的方法来实现这一点,还是不鼓励这样做?

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

【问题讨论】:

  • 当崩溃发生时,您的活动被破坏,因此无法自己处理崩溃。
  • @Raghunandan 是的,但是如果由于未处理的异常而发生崩溃,您可以使用通用的捕获所有异常处理程序并防止它完全崩溃。
  • @LoganDam 有什么办法吗?
  • @mattblang 实际上,我已经有一段时间没有碰过我的安卓设备了,工作一直很疯狂。不过可能很快就会再次回到安卓世界。 CRUSADER 的选项看起来就像我读过的书一样。

标签: java android exception-handling


【解决方案1】:

我在 Log 类中找到了“wtf”(多么可怕的失败)方法。来自描述:

根据系统配置,报告可能会添加到 DropBoxManager 和/或进程可能会立即终止 一个错误对话框。

http://developer.android.com/reference/android/util/Log.html

【讨论】:

    【解决方案2】:

    在这里,检查link for reference

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

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

    现在是重要的部分,即如何捕获该异常。 虽然很简单。在您覆盖的 onCreate 方法中调用 super 方法之后,在每个 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);
        }
    }
    

    希望这会有所帮助...

    【讨论】:

    • 您的示例活动没有实现UncaughtExceptionHandler :) 感谢您的回答,我下班回家后试试。
    • 另外,是否应该将Thread.setDefaultUncaughtExceptionHandler() 放在您的主要/第一个活动中,以便处理应用程序中的所有异常?
    • 我说,要创建一个类说 ExceptionHandler 实现 java.lang.Thread.UncaughtExceptionHandler.... 然后在你的正常活动中添加上面提到的代码行......请参考上面提到的链接以获取更广泛的想法..
    • @CRUSADER 非常感谢您作为参考链接提到的链接工作正常。
    • 或者只需将该行添加一次到 BaseActivity 并在整个应用中子类化此 Activity。
    【解决方案3】:

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

    //******************************************
    //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

    【讨论】:

    • 可能您应该在向用户显示错误消息之前对其进行处理
    猜你喜欢
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    • 2017-05-11
    • 2011-11-10
    • 2013-04-22
    • 1970-01-01
    相关资源
    最近更新 更多