我有一个小方法,看起来像这样:
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.调用方法可以做的最多是稍后重试.
如果我重新抛出我所捕获的所有异常,那么调用方法就会充满异常处理块.
(我很抱歉,如果这看起来像一个微不足道的问题.我只是想学习编写更好的代码.谢谢.)
最佳答案 创建一个专用异常,它具有适当的抽象级别(类似于UnstarTrackException).抛出这样的异常,包装您捕获的原始异常.这样,调用者只需要处理一个异常(我假设所有异常应该以相同的方式处理:重试).
是否应检查此例外取决于您的口味.如果要强制方法的所有调用方处理此异常,请将其设为已检查的异常.如果要让调用者选择是否要处理此异常,请使用运行时异常.
如果此方法深埋在代码层中,并且如果只能在顶层处理异常,则运行时异常可能是更好的选择.事实上,除非你是这个方法的唯一调用者,否则运行时异常也可能是更好的选择.如今,检查的例外情况往往不会被大量使用.