このトピックで尋ねられた別の質問と同様に、例外をキャッチする場合throw
は、警告が表示されないようにするために、ハンドラー内にファイナルが必要です。
この警告に関するMSDN ドキュメントから:
この規則違反を修正するには、より具体的な例外をキャッチするか、catch ブロックの最後のステートメントとして一般的な例外を再スローします。
とはいえ、例外を再スローするのではなく、「飲み込み」たいので、これはあなたの状況では本当に役に立ちません。この 6 つの特定の例外のリストを見ると、可能な限り最も推奨される方法でそれぞれの例外を処理するのに時間 (真剣に 5 分程度) を費やすのが苦痛な経験になるとは想像できません。これはそれほど頻繁に発生するわけではなく、WebRequest はそのまれな例の 1 つにすぎません。
アプリケーションの有効期間が長い場合は、時間が経つにつれて、これらの例外のそれぞれに対してハンドラーを実装していることに気付く可能性があります。「一般的なエラー 405 が発生しました」というエラー メッセージが好きな人はいません。これは KISS ではないかもしれませんが、基礎を整えることで、すべての例外 ( などOutOfMemoryException
) のキャッチを回避できるという利点が得られ、FxCop の警告 (およびうるさい開発者からの軽蔑) も防ぐことができます。
アプリケーションで大量の WebRequest を生成している場合、次のようなヘルパー クラスが役立つ可能性があります。これは、単一のエラー メッセージをスローし、WebFetcherException
さらに役立つエラー メッセージを表示します。次に例を示します。
public static class WebFetcher
{
public WebResponse FetchFromUrl(Uri uri)
{
try
{
var request = WebRequest.Create(new Uri("MyUrl")) as HttpWebRequest;
return request.GetResponse();
}
catch (NotSupportedException ex)
{
//you could customize the error messages to be more suitable for your
//application, or leaving room for future error handling
throw new WebFetcherException(ex.Message, ex);
}
catch (ArgumentNullException ex)
{
throw new WebFetcherException(ex.Message, ex);
}
catch (SecurityException ex)
{
throw new WebFetcherException(ex.Message, ex);
}
catch (ProtocolViolationException ex)
{
throw new WebFetcherException(ex.Message, ex);
}
catch (WebException ex)
{
throw new WebFetcherException(ex.Message, ex);
}
catch (InvalidOperationException ex)
{
throw new WebFetcherException(ex.Message, ex);
}
}
public class WebFetcherException : Exception
{
public WebFetcherException(string message, Exception inner)
: base(message, inner)
{ }
}
}