ホームページ > バックエンド開発 > C++ > C# で例外を適切に再スローし、スタック トレースを保存する方法

C# で例外を適切に再スローし、スタック トレースを保存する方法

Patricia Arquette
リリース: 2025-01-23 19:01:08
オリジナル
516 人が閲覧しました

How to Properly Rethrow Exceptions in C# and Preserve the Stack Trace?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート