39

例外がスローされた場合に例外をキャッチする必要があるが、何もしないという状況に遭遇することがあります。つまり、例外が発生する可能性がありますが、発生しても問題ありません。

私は最近、同様のことについてこの記事を読みました: http://c2.com/cgi/wiki?EmptyCatchClause

この人は、

// should never occur 

はコードの臭いであり、コードに表示されるべきではありません。次に、コメントがどのように表示されるかを説明します。

// don't care if it happens

はまったく異なり、私自身もこのような状況に遭遇します。たとえば、電子メールを送信するときは、次のようにします。

var addressCollection = new MailAddressCollection();
foreach (string address in addresses)
{
    try
    {
        addressCollection.Add(address);
    }
    catch (Exception)
    {
        // Do nothing - if an invalid email occurs continue and try to add the rest
    }
}

ここで、ユーザーに戻って 1 つ以上のメッセージを受信者に送信できなかったことを説明したいので、これを行うのは悪い考えだと思うかもしれません。しかし、それが単なる CC アドレスの場合はどうでしょうか? それはそれほど重要ではなく、たとえそれらのアドレスの 1 つが無効であったとしても (単にタイプミスの可能性があります)、とにかくメッセージを送信したい場合があります。

だから私は空のキャッチブロックを使用するのが正しいですか、それとも私が知らないより良い代替手段はありますか?

4

5 に答える 5

7

例外がスローされてはならない場合は、それをキャッチしても意味がありません。発生してはならず、発生した場合はそれについて知る必要があります。

問題が発生する可能性のある特定のシナリオがある場合は、それらの特定のシナリオをキャッチしてテストし、他のすべての場合に再スローする必要があります。たとえば、

foreach (string address in addresses)
{
    try
    {
        addressCollection.Add(address);
    }
    catch (EmailNotSentException ex)
    {
        if (IsCausedByMissingCcAddress(ex))
        {
            // Handle this case here e.g. display a warning or just nothing
        }
        else
        {
            throw;
        }
    }
}

上記のコードは、 をキャッチするのではなく、特定の (架空の場合) 例外をキャッチすることに注意してくださいExceptionExceptionスローされると予想される特定の例外タイプをキャッチするのではなく、キャッチすることが正当なケースはほとんどないと思います。

于 2013-05-23T13:51:25.547 に答える
2

Exception空の catch ブロックを使用すると、例外が飲み込まれるだけです。発生したことが報告されていても、常に例外を処理します。

また、ジェネリックExceptionをキャッチすることは、アプリケーションのバグを隠す可能性があるため、悪い習慣です。たとえば、ArgumentOutOfRange発生していることに気付かなかった例外をキャッチし、それを飲み込んだ可能性があります (つまり、何もしていません)。

于 2013-05-23T13:50:33.100 に答える