5

StackOverflowException.NET 2.0のように、catch ブロックでキャッチできない例外の種類がいくつかあることは知っています。他のどの例外がキャッチすることをお勧めできないか、または悪い慣行に関連付けられているかを知りたいです。

この例外タイプのリストを使用したい方法はException、catch ブロックで使用するたびにチェックすることです。

private static readonly Type[] _exceptionsToNotCatch = new Type[] { typeof(StackOverflowException) };

// This should never throw, but should not swallow exceptions that should never be handled.
public void TryPerformOperation()
{
    try
    {
        this.SomeMethodThatMightThrow();
    }
    catch (Exception ex)
    {
        if (_exceptionsToNotCatch.Contains(ex.GetType()))
            throw;
    }
}

編集

私はあまり良い例を提供したとは思いません。これは、自分の意味を伝えようとするときに例を些細なものにしようとする際の問題の 1 つです。

私は自分で Exception をスローすることはなく、常に特定の例外をキャッチし、次のように Exception のみをキャッチします。

try
{
    this.SomeMethodThatMightThrow();
}
catch (SomeException ex)
{
    // This is safe to ignore.
}
catch (Exception ex)
{
    // Could be some kind of system or framework exception, so don't handle.
    throw;
}

私の質問は、より学術的なものとして意図されていました。システムによってのみスローされ、キャッチされるべきではない例外はどれですか? 次のような状況が心配です。

try
{
    this.SomeMethodThatMightThrow();
}
catch (OutOfMemoryException ex)
{
    // I would be crazy to handle this!
    // What other exceptions should never be handled?
}
catch (Exception ex)
{
    // Could be some kind of system or framework exception, so don't handle.
    throw;
}

この質問は、System.Data.EntityUtil.IsCatchableExceptionType(Exception) in System.Data.Entity, Version=3.5.0.0 に本当に触発されました。

4

4 に答える 4

17

他のどの例外がキャッチすることをお勧めできないか、または悪い慣行に関連付けられているかを知りたいです。

キャッチしてはならないすべての例外のリストを次に示します。

  1. 何をすべきかわからない例外

例外処理のベスト プラクティスは次のとおりです。

例外の処理方法がわからない場合は、キャッチしないでください。

これは皮肉に聞こえるかもしれませんが、どちらも正しいので、知っておく必要があるのはそれだけです。

于 2013-09-22T22:19:44.380 に答える
2

ブロックで使用Exceptionすると、catchキャッチ可能なすべての例外がキャッチされます。キャッチする必要のある例外のみを指定し、キャッチしたくない例外は流出させるべきだと思います。例えば

try
{

}
catch(SqlException sqlex)  //specific to database calls
{
   //do something with ex
}
catch(FormatException fex) //specific to invalid conversion to date, int, etc
{
   //do something with ex
}
catch(Exception ex)
{
    //I didn't know this exception would be thrown
    //log it for me or Rethrow it
}

そのリストにない他の例外はキャッチされません

于 2013-09-22T22:23:16.323 に答える
0

わかりましたので、それは良い考えではありません。そして、SO のプログラマーは自分を刺すナイフを手渡すよりも、自分の高馬からの意見を好むことを確立しました。

(ハンスのリストを指すように私のリストとDRYing-up SOを編集)

https://stackoverflow.com/a/5508733/17034

于 2017-10-25T17:42:58.283 に答える