4

次のような小さなメソッドがあります。

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場合に発生する可能性があり、ストリームの読み取りに問題があった場合に発生する可能性があります。呼び出し元のメソッドができることは、後でこれを再試行することだけです。

トラップしたすべての例外を再度スローすると、呼び出し元のメソッドが例外処理ブロックでいっぱいになってしまいます。

(これが些細な質問のように思われる場合は申し訳ありません。私は単により良いコードを書くことを学ぼうとしています。ありがとう。)

4

1 に答える 1

2

適切な抽象化レベル (UnstarTrackException など) を持つ専用の例外を作成します。キャッチした元の例外をラップして、そのような例外をスローします。そうすれば、呼び出し元は 1 つの例外を処理するだけで済みます (すべての例外を同じ方法で処理する必要があると思います: 再試行)。

この例外をチェックするかどうかは、好みによって異なります。メソッドのすべての呼び出し元にこの例外を処理させたい場合は、それをチェック済み例外にします。呼び出し元にこの例外を処理するかどうかを選択させたい場合は、実行時例外を使用します。

このメソッドがコード層の奥深くに埋め込まれていて、例外が最上位層でしか処理できない場合は、おそらく実行時例外の方が適しています。実際、このメソッドの唯一の呼び出し元でない限り、実行時例外もおそらくより適切な選択です。チェック例外は、最近ではあまり使用されない傾向があります。

于 2013-01-21T21:12:16.983 に答える