【问题标题】:Catch all type exceptions programming Android捕获所有类型的异常编程 Android
【发布时间】:2011-08-12 01:16:12
【问题描述】:

我正在为 Android 操作系统开发应用程序。 由于这是我的第一个应用程序,我认为我犯了一些编程错误,因为我几乎无法将错误追溯到它们的原因。 因此,我在猜测,当我试图修复错误时,有没有办法在我的整个活动生命周期中通过一次 try-catch 来捕获所有类型的异常?

那太棒了,看着我的 Galaxy S 说:“抱歉,应用程序意外停止了” :(

【问题讨论】:

    标签: java android exception exception-handling


    【解决方案1】:

    我假设像纯 java

    try {
    
    } catch(throwable t) {
    
    }
    

    但这是非常糟糕的做法。

    也看看

    Setting UncaughtException handler

    【讨论】:

    • 是的,我认为 OP 正在寻找的是 UncaughtExceptionHandler。您可以将其设置为不爆炸并显示“强制关闭”消息,但通常您仍希望让它完成,因为您可能无法恢复。
    • 是的,UncaughtExceptionhandler 正是我想要的。谢谢!
    【解决方案2】:
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    import android.app.Activity;
    import android.content.Context;
    
    public class SRSDexception implements Thread.UncaughtExceptionHandler {
    
    private Thread.UncaughtExceptionHandler defaultUEH;
    
    private Activity app = null;
    
    public SRSDexception(Activity app) {
    this.defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
        this.app = app;
    
    }
    
    public void uncaughtException(Thread t, Throwable e) 
    {   
    
    StackTraceElement[] arr = e.getStackTrace();
    String Raghav =t.toString();
    String report = e.toString()+"\n\n";
    report += "--------- Stack trace ---------\n\n"+Raghav;
    for (int i=0; i<arr.length; i++)
    {
    report += "    "+arr[i].toString()+"\n";
    }
    report += "-------------------------------\n\n";
    
    // If the exception was thrown in a background thread inside
    // AsyncTask, then the actual exception can be found with getCause
    report += "--------- Cause ---------\n\n";
    Throwable cause = e.getCause();
    if(cause != null) {
    report += cause.toString() + "\n\n";
    arr = cause.getStackTrace();
    for (int i=0; i<arr.length; i++)
    {
    report += "    "+arr[i].toString()+"\n";
    }
    }
    report += "-------------------------------\n\n";
    
    try {
    FileOutputStream trace = app.openFileOutput(
    "stack.trace", Context.MODE_PRIVATE);
    trace.write(report.getBytes());
    trace.close();
    } catch(IOException ioe) {
    // ...
    }
    
    defaultUEH.uncaughtException(t, e);
    }
    
    }
    

    【讨论】:

      【解决方案3】:

      如果您使用的是 Eclipse,则强制关闭应用程序的每个异常(也就是您提到的消息)都应该记录在“LogCat”中。

      查看 LogCat 的最简单方法是打开 DDMS 透视图并单击 LogCat 选项卡(如果尚未显示,则从“查看”菜单打开)。

      【讨论】:

        【解决方案4】:

        我真的,真的不推荐这个......

        try {
             ...
        } catch (Exception e) {
             // This will catch any exception, because they are all descended from Exception
        }
        

        您是否正在查看堆栈跟踪以调试您的问题?追踪它们应该不难。查看 LogCat 并查看大块红色文本,看看是哪种方法导致了您的崩溃以及您的错误是什么。

        如果您以这种方式捕获所有错误,您的程序将无法按预期运行,并且当您的用户报告错误时,您将不会从 Android Market 收到错误报告。

        您可以使用 UncaughtExceptionHandler 来防止某些崩溃。我使用一个,但仅用于将堆栈跟踪打印到文件中,以便在远离计算机的手机上调试应用程序时使用。但是我在完成之后将未捕获的异常传递给默认的 Android UncaughtExceptionHandler,因为我希望 Android 能够正确处理它,并让用户有机会向我发送堆栈跟踪。

        【讨论】:

        • 是的,你不建议这样做肯定是对的,但我想知道我是否有机会处理所有未捕获的异常并通过一个自定义活动通知用户(仍然,使用 UncaughtExceptionHandler,它没有'没有正确启动新的Activity)。无论如何,我在Debug透视图中看到了Logcat选项卡,但我从未看过它,谢谢大家的提示!附言你的 UncaughtExceptionHandler 和 AndroidUncaughtExceptionHandler 之间的通道如何实现?
        • 在构造函数中,放入 mDefaultUEH = Thread.getDefaultUncaughtExceptionHandler();然后在 uncaughtException(...) 方法结束时调用 mDefaultUEH.uncaughtException()。
        • 它没有捕捉到“OutOfMemoryError”异常。
        • 如果您想完全防止您的应用程序崩溃,那么您需要像 MJB 的回答一样捕获所有 Throwable。抓不到OutOfMemoryError因为不是异常,是另一个类继承Throwable
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-01
        • 2017-05-30
        • 1970-01-01
        • 1970-01-01
        • 2014-02-26
        • 1970-01-01
        • 2011-08-20
        相关资源
        最近更新 更多