用于处理异常的示例代码

chi*_*jib 9 java android exception

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

请提供有关如何处理HttpConnection或类似类型的例外的示例代码或项目源代码.

pai*_*ego 17

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

基本上是一个经过检查的异常源自java.lang.Exception它要求如果不指定你的方法为"抛出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();
    }
}
Run Code Online (Sandbox Code Playgroud)

从中派生的未经检查的异常java.lang.RuntimeException既不需要在方法定义中指定"throws",也不需要处理它.

void foo()
{
    throw new MyUncheckedException();
}
Run Code Online (Sandbox Code Playgroud)

Checked的优点是编译器会在您未处理异常时发出警告.

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

因此,如果您小心,可能更喜欢使用未经检查的例外.

顺便说一句,您只能在定义自己的例外类型时选择.

遇到来自Java或第三方库的异常时,您必须决定如何处理它.例如,如果第三方方法抛出CheckedException1,则必须处理它,或者将调用方法声明为"throws 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.
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,您可以在没有"throws"声明的情况下抛出Unchecked异常.要从较高的位置访问原始的CheckedException1,可以使用未经检查的异常的.getCause()方法.

void caller()
{
    try {
        foo();
    } catch (MyUncheckedException e) {
        CheckedException1 ce1 = e.getCause();
        ce1.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

关于伐木,对此有不同的思想流派.

  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());
Run Code Online (Sandbox Code Playgroud)

以及所有可以优雅处理的异常,在一个模块中捕获并处理它们,在这个模块中你可以对情况有足够的了解,从而可以解决问题,然后再试一次.


Che*_*mon 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();
}
Run Code Online (Sandbox Code Playgroud)

有关该对话框的更多信息,请参阅创建对话框.

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

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