【问题标题】:Sample code to handle Exceptions处理异常的示例代码
【发布时间】:2010-09-27 16:35:16
【问题描述】:

我是 Android 移动应用程序开发的新手。 我想知道,如何处理HttpConnection 相关异常或任何其他异常之类的异常?我需要向用户显示AlertDialog 吗?

请提供示例代码或项目源代码,了解如何处理HttpConnection 或类似类型的异常。

【问题讨论】:

    标签: java android exception


    【解决方案1】:

    Java 中有两种不同类型的异常:选中和未选中。关于哪个更好使用存在很大的争论,两种论点都很好。

    基本上,Checked 异常源自java.lang.Exception,它要求如果您没有将方法指定为“throws MyCheckedException”,那么您必须在方法中捕获并处理异常。

    // throw the exception
    
    void foo() throws MyCheckedException
    {
        throw new MyCheckedException();
    }
    
    // or handle the exception
    
    void foo()
    {
        try {
           throw new MyCheckedException();
        } catch (MyRuntimeException e) {
            e.printStackTrace();
        }
    }
    

    源自java.lang.RuntimeException 的未经检查的异常既不需要您在方法定义中指定“抛出”,也不需要您处理它。

    void foo()
    {
        throw new MyUncheckedException();
    }
    

    Checked 的优点是当你没有处理异常时编译器会警告你。

    缺点是您必须为每个 Checked 异常声明 try/catch 块或 throws,并且上层代码可能会变得非常麻烦,试图处理所有不同类型的异常。

    因此,如果您小心,您可能更喜欢使用未经检查的异常。

    顺便说一句,您只能在定义自己的异常类型时选择自己的异常类型。

    当遇到来自 Java 或第三方库的异常时,您必须决定如何处理它。例如如果第 3 方方法抛出 CheckedException1,那么您必须处理它,或者将调用方法声明为“抛出 CheckedException1”。如果您想避免使用 Checked Exceptions,那么您可以将其包装在 Unchecked Exception 中并抛出它。

    void foo() // no throws declaration
    {
        try {
            thirdPartyObj.thirdPartyMethod(); // this throws CheckedException1
        }
        catch (CheckedException1 e) {
            throw new MyUncheckedException(e); // this will wrap the checked in an unchecked.
        }
    }
    

    请注意,您可以在没有“throws”声明的情况下抛出 Unchecked 异常。要从更高层访问原始 CheckedException1,您可以使用 Unchecked 异常的 .getCause() 方法。

    void caller()
    {
        try {
            foo();
        } catch (MyUncheckedException e) {
            CheckedException1 ce1 = e.getCause();
            ce1.printStackTrace();
        }
    }
    

    ...但是由于 foo() 的异常是未经检查的,您没有处理它或声明“抛出”。

    关于伐木,有不同的思想流派。

    1. 异常发生时记录(低级)
    2. 到达顶部时记录(高级)
    3. 当您有足够的信息来进行适当的操作和/或记录消息时记录它。 (中级)

    我发现一个好的策略是安装一个未捕获的异常处理程序,它将处理所有未捕获的(显然是未经检查的)异常。这样,任何遗漏的内容都会被记录下来,并可能在系统崩溃之前进行处理。

    public class MyExceptionHandler implements UncaughtExceptionHandler 
    {       
        @Override
        public void uncaughtException(Thread thread, Throwable ex)
        {
            ex.printStackTrace();
        }
    }
    
    // In your high-level code
    Thread.setDefaultUncaughtExceptionHandler(new MyExceptionHandler());
    

    以及所有可以优雅处理的异常,在一个模块中捕获并处理它们,在该模块中您对情况有足够的了解以可能纠正问题并重试。

    【讨论】:

    • 这是我轻松读过的关于异常处理的最佳解释,这很可悲,因为我已经在谷歌上搜索了一两个小时。先生,您应该得到更多的支持。
    • 祝你好运,Gowie47! :)
    • 感谢您提供如何处理第三方异常的好例子。
    【解决方案2】:

    如何处理异常取决于异常。如果异常是您无法恢复的,并且用户需要了解,那么您可以捕获异常并将其显示在 AlertDialog 中:

    try {
      // do something
    } catch (SomeImportantException e) {
      AlertDialog.Builder builder = new AlertDialog.Builder(this);
      builder.setMessage("User friendly text explaining what went wrong.");
      AlertDialog alert = builder.create();
      alert.show();
    }
    

    有关对话框的详细信息,请参阅creating dialogs

    或者,如果异常是您可以处理的,您可以只记录有关异常的信息并继续。

    try {
      // do something
    } catch (SomeLessImportantException e) {
      Log.d(tag, "Failed to do something: " + e.getMessage());
    }
    

    【讨论】:

    • 虽然这个答案是准确的,但下面paiego的答案更有帮助。
    【解决方案3】:

    您可以使用提供此功能的 ACRA 插件或 BugSense 来收集错误报告。 免责声明:我是 BugSense 的创始人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-01
      • 1970-01-01
      • 2011-11-11
      • 1970-01-01
      • 1970-01-01
      • 2014-06-08
      • 2010-10-25
      • 1970-01-01
      相关资源
      最近更新 更多