我是Android移动应用程序开发的新手。
我想知道,我如何处理HttpConnection
相关异常或任何其他异常等异常?我是否需要向用户显示AlertDialog
?
请提供示例代码或项目源代码,了解如何处理HttpConnection
或类似类型的例外。
答案 0 :(得分:17)
Java中有两种不同的例外:Checked和Unchecked。关于哪一个更好用,这两个论点都很好,这是一个很大的争论。
基本上,Checked异常派生自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();
}
}
从java.lang.RuntimeException
派生的未经检查的异常既不需要在方法定义中指定“throws”,也不需要处理它。
void foo()
{
throw new MyUncheckedException();
}
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.
}
}
请注意,您可以在没有“throws”声明的情况下抛出Unchecked异常。要从较高的位置访问原始的CheckedException1,可以使用未经检查的异常的.getCause()方法。
void caller()
{
try {
foo();
} catch (MyUncheckedException e) {
CheckedException1 ce1 = e.getCause();
ce1.printStackTrace();
}
}
...但是因为来自foo()的异常是未选中的,你不会拥有来处理它或声明“抛出”。
关于伐木,对此有不同的思想流派。
我发现一个好的策略是安装一个未捕获的异常处理程序,它将处理所有未捕获(显然未经检查)的异常。这样,任何遗漏的内容都将被记录下来并在崩溃系统之前进行处理。
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 :(得分: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());
}
答案 2 :(得分:0)
您可以使用提供此功能的ACRA插件或BugSense来收集错误报告。 免责声明:我是BugSense的创始人。