4

我有一個看起來像這樣的小方法:處理某些運行時HTTP異常的良好做法是什麼?

public static void unstarTrack(Context ctxContext, String strId) { 

    try { 

     HttpParams htpParameters = new BasicHttpParams(); 

     List<NameValuePair> lstCredentials = new ArrayList<NameValuePair>(); 
     lstCredentials.add(new BasicNameValuePair("t", String.valueOf(System.currentTimeMillis()/1000))); 
     lstCredentials.add(new BasicNameValuePair("__call", "favourites.removeSong")); 

     HttpPost htpPost = new HttpPost(API_URL); 
     htpPost.setEntity(new UrlEncodedFormEntity(lstCredentials)); 
     htpPost.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; rv:18.0) Gecko/20100101 Firefox/18.0"); 
     htpPost.addHeader("Accept-Encoding", "gzip"); 
     DefaultHttpClient dhcClient = new DefaultHttpClient(htpParameters); 

     HttpResponse resResponse = dhcClient.execute(htpPost); 
     Log.d(TAG, EntityUtils.toString(resResponse.getEntity())); 

     return; 

} catch (SocketException e) { 
    throw new RuntimeException("problem with network connectivity.", e); 
} catch (UnsupportedEncodingException e) { 
    throw new RuntimeException("Encoding not supported.", e); 
} catch (ClientProtocolException e) { 
    throw new RuntimeException("A protocol exception was encountered.", e); 
} catch (ParseException e) { 
    throw new RuntimeException("An error occurred while trying to read the header elements.", e); 
} catch (IOException e) { 
    throw new RuntimeException("An error occurred while trying to read response stream.", e); 
} 

}

的方法本身是很簡單,但它包含了許多例外,一個發生,我不知道我應該如何處理那些。通過做一個簡單的'e.printStackTrace()'來壓制他們似乎不是一個好主意,所以我開始閱讀異常處理最佳實踐,但我仍然有點失落。我應該如何處理例外情況?

我需要對我的例外做些事情,因爲我不想從該方法返回null。從我的方法中返回一個null意味着調用方法將無法瞭解我的方法內是否發生異常。

我應該創建一個自定義異常,並提出或應該簡單地引發未經檢查的異常?

調用方法不能真正做很多工作來影響我的方法,即一個SocketException如果有與網絡連接問題可能會發生,如果有讀取流的問題,可能會出現一個IOException。調用方法可以做的最多的事情就是稍後再試。

如果我重新拋出所有我已經陷入的異常,那麼調用方法就會被異常處理塊搞砸了。

(我很抱歉,如果這似乎是一個微不足道的問題,我只是想學寫更好的代碼。謝謝。)

+1

你正在拋出異常,如果發生異常,你將不會返回null,你將不會返回任何東西。無論如何,你的方法被聲明爲「void」 - 你*不能*返回任何東西。 *如何處理異常完全取決於...您想如何處理異常。 –

+0

只捕捉對用戶或您自己有所影響的異常。一個異常有一個getMessage()方法,可以在任何情況下使用,即使它捕獲catch(Exception e)。如果發生任何異常,也決定如何處理。應用程序是否終止?它應該顯示一條消息嗎?如果您針對某些異常提出了不同的答案,則只需要捕獲特殊的例外情況。 –

回答

2

創建一個專用的例外,它有適當的抽象層(喜歡的事UnstarTrackException)。拋出這樣的異常,包裝你捕捉到的原始異常。這樣,調用者只需要處理一個異常(我假定所有異常都應該以同樣的方式處理:重試)。

是否需要檢查這個例外情況取決於你的口味。如果你想強制你的方法的所有調用者來處理這個異常,使它成爲一個檢查的異常。如果您想讓調用者選擇是否要處理此異常,請使用運行時異常。

如果此方法深埋在代碼層內,並且只能在頂層處理異常,則運行時異常可能是更好的選擇。事實上,除非您是此方法的唯一調用者,否則運行時異常也可能是更好的選擇。現在檢查的異常現在不會使用太多。

+0

「現在檢查的異常現在不會使用太多。」真?證據? – EJP

+0

Hibernate從檢查到所有未經檢查的異常。 JDBC使用檢查的異常,但JPA僅使用運行時異常。 Spring使用(幾乎?)只有運行時異常。 Java 8'java。時間API只有運行時異常(如DateTimeParseException),儘管舊的SimpleDateFormat類使用檢查的ParseException。另見http://tutorials.jenkov.com/java-exception-handling/checked-or-unchecked-exceptions.html –

相關問題