重複の可能性:
C# で例外を再スローする適切な方法は何ですか?
「throw ex」の使用法が元のスタック トレースを非表示にする理由を理解したいですか? C# コンパイラを設計する際の舞台裏の基本的な哲学は何でしたか?
重複の可能性:
C# で例外を再スローする適切な方法は何ですか?
「throw ex」の使用法が元のスタック トレースを非表示にする理由を理解したいですか? C# コンパイラを設計する際の舞台裏の基本的な哲学は何でしたか?
これは実際にはC#の質問ではなく、CLIの設計の質問であり、さまざまなIL命令に帰着throw
しrethrow
ます。
基本的に、throw ex;
(ex
オリジナルの場合でも)はILですがthrow
、-throw;
はILrethrow
です。
スローする特定の例外を指定している場合、この例外は論理的にここから発生していることになります。ここでは、このメソッドです。そうでない場合は、次のいずれかを行います。
throw;
throw ex;
または:例外を別の例外でラップするのではなく、元の例外を保持し、新しい例外がどこから来たのかを示します。
throw new SomeException(ex);
この場合、呼び出し元はを介して元のスタックトレースを取得できますex.InnerException
。
例外をキャッチすると、その「発生場所」は別の場所にあり、例外はスローされた場所までスタック トレースを保持します。クラスthrow
のインスタンスのスタック トレースを初期化すると考えてください。Exception
そのため、現在のスタックthrow ex;
でのスタック トレースを初期化しex
ます。