C# の正しい例外再スロー方法
C# で例外を処理する場合、スタック トレースの精度を確保するには、正しい再スロー構文が重要です。いくつかの再スロー手法は似ていますが、微妙な違いがデバッグ プロセスに影響を与える可能性があります。
方法 1:
<code class="language-csharp">try { // ...代码块... } catch (Exception ex) { // ...处理代码... throw; }</code>
このメソッドは、キャッチした例外を変更せずに単に再スローします。通常、この方法は元のスタック トレースを保存し、開発者が例外をソースまで正確に追跡できるため、方法 2 よりも好まれます。
方法 2:
<code class="language-csharp">try { // ...代码块... } catch (Exception ex) { // ...处理代码... throw ex; }</code>
このメソッドも例外を再スローしますが、スタック トレースが変更される可能性があります。キャッチした例外を明示的にスローすると、新しいスタック フレームが作成され、例外の元のソースがわかりにくくなり、根本原因を特定することがさらに困難になります。
他のソースからの例外を再スローするには、ExceptionDispatchInfo を使用します:
別のコンテキスト (集約例外や別のスレッドなど) から例外を再スローする必要がある場合は、ExceptionDispatchInfo
クラスを使用する必要があります。このクラスは、元の例外の必要な情報を取得し、元のスタック トレースを保持しながら、新しいコンテキストで例外を再スローできるようにします。
例:
<code class="language-csharp">try { methodInfo.Invoke(...); } catch (System.Reflection.TargetInvocationException e) { System.Runtime.ExceptionServices.ExceptionDispatchInfo.Capture(e.InnerException).Throw(); throw; // 告知编译器代码流不会离开此代码块 }</code>
ExceptionDispatchInfo
クラスを使用すると、元の例外のコンテキストとスタック トレースが保存され、開発者がエラーをソースまで正確に追跡できるようになります。
以上がC# で例外を適切に再スローし、スタック トレースを保存する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。