Android异常处理最佳实践?


77

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

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

并做一个新的Activity解释,说明应用程序立即崩溃(并且还使用户有机会发送包含错误详细信息的邮件),而不是由于Android而造成了延迟。是否有更好的方法来实现这一目标?

更新:我使用的是启用了ART的Nexus 5,但我没有注意到我以前遇到的崩溃(我最初所说的“挂起”)是延迟的。我认为既然现在所有内容都是本机代码,那么崩溃会立即发生,并且会获取所有崩溃信息。也许Nexus 5很快就可以了:)不管怎么说,这可能不会在将来的Android版本中引起担心(假设ART将成为Android L中的默认运行时)。



当发生崩溃时,您的活动将被破坏,因此无法自行处理崩溃。
Raghunandan

@Raghunandan是的,但是如果由于未处理的异常而导致崩溃,则可以使用常规捕获所有异常处理程序并防止其完全崩溃。
拉丹

@LoganDam有没有发现什么?
theblang 2013年

@mattblang我实际上已经有一段时间没有碰过我的android了,工作真是疯狂。可能很快会再次回到android世界。CRUSADER的选项看起来像是我完成阅读后的方法。
拉丹

Answers:


102

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

在这里您创建一个类ExceptionHandler that implements java.lang.Thread.UncaughtExceptionHandler..

在本课程中,您将进行一些节省生命的工作,例如创建stacktrace和准备上载错误报告等。

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

Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler(this));

您的活动可能看起来像这样……

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

@CRUSADER非常感谢您,作为参考链接提到的链接可以正常工作。
艾哈迈德·阿尔斯兰

8
或仅将该行添加到BaseActivity并在整个应用中将此活动子类化。
WKS

9

您可以只使用常规警报对话框快速显示错误消息。例如...

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


在向用户显示错误消息之前,您可能应该先处理该错误消息
hyena

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.