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 –

相关问题