我是Android移動應用程序開發的新手。 我想知道,我如何處理異常,例如HttpConnection
相關異常或任何其他異常?我是否需要向用戶顯示AlertDialog
?處理異常的示例代碼
請提供示例代碼或項目源代碼,瞭解如何處理HttpConnection
或類似類型的異常。
我是Android移動應用程序開發的新手。 我想知道,我如何處理異常,例如HttpConnection
相關異常或任何其他異常?我是否需要向用戶顯示AlertDialog
?處理異常的示例代碼
請提供示例代碼或項目源代碼,瞭解如何處理HttpConnection
或類似類型的異常。
你如何處理異常取決於例外。如果異常的東西,你不能恢復,用戶需要了解的,那麼你可以捕獲該異常,並顯示在一個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());
}
在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();
}
}
...但由於從富(除外)未選中,你不有辦理或者申報「拋出」。
關於伐木,對此有不同的思想流派。 ( - 水平低)
我發現一個很好的策略是安裝一個未捕獲的異常處理程序,它將處理所有未捕獲(明顯未檢查)的異常。這樣,任何錯過的東西都會被記錄下來,並在系統崩潰之前處理。
public class MyExceptionHandler implements UncaughtExceptionHandler
{
@Override
public void uncaughtException(Thread thread, Throwable ex)
{
ex.printStackTrace();
}
}
// In your high-level code
Thread.setDefaultUncaughtExceptionHandler(new MyExceptionHandler());
和所有可以優雅地處理異常,捕獲並在那裏你足夠了解的情況,有可能糾正問題並再試一次一個模塊中處理它們。
這很容易**我在異常處理上讀到的最好的解釋,這很讓人傷心,因爲我一直在搜索一兩個小時。你應該得到更多的讚揚先生。 – Gowiem 2013-07-17 17:06:12
對你來說,Gowie47! :) – paiego 2013-07-17 20:16:10
謝謝你的好例子,如何處理第三方異常。 – shadowhorst 2016-06-16 06:10:58
您可以使用提供此功能的ACRA插件或BugSense來收集錯誤報告。 免責聲明:我是BugSense的創始人。
雖然這個回答是正確的,但paiego的回答下面更有幫助。 – Gowiem 2013-07-17 17:07:23