以下はコード スニペットです。
class xxx
{
public xxx(){}
try
{
throw new Exception(InvalidoperationException);
}
catch(Exception x)
{
}
catch(InvalidoperationException x)
{
}
}
ここで発生する例外とその背後にある理由を誰でも知ることができます。
以下はコード スニペットです。
class xxx
{
public xxx(){}
try
{
throw new Exception(InvalidoperationException);
}
catch(Exception x)
{
}
catch(InvalidoperationException x)
{
}
}
ここで発生する例外とその背後にある理由を誰でも知ることができます。
うわー、ここには多くの問題があります。どこから始めれば?
そのコードはコンパイルされません。定義したtry-catch
ブロックは、許可されていないメソッドの外側にあります。メソッド内に移動する必要があります。
メソッドの後半で自分自身をキャッチするつもりのメソッドをスローしないでください。これは、「フロー制御」に例外を使用することとして一般的に知られていますが、これは完全に推奨されていません。これにはパフォーマンス コストが伴います。また、独自の例外をスローしてキャッチするコードがある場合、デバッガーを使用するとスローされる例外を監視するのが非常に混乱します。必要に応じて、フロー制御にブール変数 (フラグと呼ばれる) を使用します。
常に、最も派生した例外クラスを最初にキャッチします。つまり、をキャッチしようとする前にInvalidOperationException
、最初にキャッチする必要があります。コード内のブロックの順序を逆にする必要があります。Exception
catch
あなたは実質的に決して捕まえるべきではありませんSystem.Exception
。キャッチする必要がある唯一の例外は、明示的に理解し、処理できる例外です。一般的な例外がスローされたという情報しか得られない場合、何が問題なのか、またはそれをどのように処理するのかを知る方法は事実上ありません。
同じように、独自のコードからこの例外をスローしないでください。基本クラスから継承する、より記述的な例外クラスを選択するSystem.Exception
か、同じクラスから継承して独自の例外クラスを作成します。
他の回答が、コードを書き直した場合に、コードがどのように見えるべき
かのサンプルコードを示していることがわかります。あなたのコードを正しく書き直すと、次のようになるので、私はそれをするつもりはありません:
class Xxx
{
public Xxx()
{
}
}
特に役に立ちません。
コードがこのような場合
class xxx
{
public xxx(){
try
{
throw new Exception(InvalidoperationException);
}
catch(InvalidoperationException x)
{
}
catch(例外 x) { } } }
コンパイルして例外を発生させ、キャッチする必要があります。そうしないと、コードはまったくコンパイルされません。
このコードはコンパイルされないため、例外はスローされません。
とにかく - いくつかのポイント:
InvalidOperationException
も前に配置する必要がありますException
)。Exception
通常、キャッチはあまり役に立ちません。あなたはおそらく次のことを意味していました:
throw new InvalidOperationException();
ただし、例外を構造化した方法では、catch(Exception x)
ブロックが実行されます。
いいえ。コンパイルされません。したがって、どの例外が生成されるかについては疑問の余地がありません。
コードは次のようになります。
class xxx
{
public void Test()
{
try
{
throw new InvalidoperationException();
}
catch(InvalidoperationException exception)
{
// Something about InvalidOperationException;
}
catch(Exception exception)
{
// Something about the Exception
}
}
}
注意点:
コードはコンパイルされませんが、無視します...
行だけを見ると:
throw new Exception(InvalidoperationException);
まず第一に、MSDN によると、そのようなコンストラクターはありません。したがって、コンストラクター Exception(String msg, Exception innerException) を意味していると仮定します。意味: throw new Exception("blabla", InvalidoperationException);
スローされる例外のタイプはExceptionであり、 InvalidOperationExceptionではありません。したがって、 catch(Exception x)のみがそれをキャッチできます。
キャッチの順序を記述した方法よりもInvalidoperationExceptionをスローした場合、Exception クラスが最初にキャッチされます。キャッチの順序は重要です。
私があなたに与えることができる最善のアドバイスは、単に自分で試してみて、何が起こるかを確認することです.
コンパイルの問題を無視しています....最初に一致する例外ブロック ( catch(Exception x)
) が例外を取得します。その後、例外を無視して再スローしないため、例外は外部から見られます。ただし、それは良い習慣にはなりません...特に、任意のものをキャッチException
して無視することは危険です-それは何でもあった可能性があります...それは必ずしもあなたが思っていた例外ではありません.