2010-09-27 106 views
9

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

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

回答

10

你如何处理异常取决于例外。如果异常的东西,你不能恢复,用户需要了解的,那么你可以捕获该异常,并显示在一个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()); 
} 
+0

虽然这个回答是正确的,但paiego的回答下面更有帮助。 – Gowiem 2013-07-17 17:07:23

17

在Java中有两种不同的异常:Checked和Unchecked。关于哪一个更好用,有一个很大的争论,两个论点都很好。

基本上检查异常是从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的优点是编译器会在您没有处理异常时发出警告。

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

由于这个原因,如果你小心,你可能更喜欢使用未经检查的例外。

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

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

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(); 
    } 
} 

...但由于从富(除外)未选中,你不办理或者申报“抛出”。

关于伐木,对此有不同的思想流派。 ( - 水平低)

  • 记录它,当它到达顶部(高 - 级)
  • 记录它,当你有足够的信息来作出适当的动作和/或

    1. 发生异常时记录它日志消息。 (中级)

    我发现一个很好的策略是安装一个未捕获的异常处理程序,它将处理所有未捕获(明显未检查)的异常。这样,任何错过的东西都会被记录下来,并在系统崩溃之前处理。

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

    和所有可以优雅地处理异常,捕获并在那里你足够了解的情况,有可能纠正问题并再试一次一个模块中处理它们。

  • +1

    这很容易**我在异常处理上读到的最好的解释,这很让人伤心,因为我一直在搜索一两个小时。你应该得到更多的赞扬先生。 – Gowiem 2013-07-17 17:06:12

    +0

    对你来说,Gowie47! :) – paiego 2013-07-17 20:16:10

    +1

    谢谢你的好例子,如何处理第三方异常。 – shadowhorst 2016-06-16 06:10:58

    0

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