2010-09-27 107 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的創始人。