ホームページ > バックエンド開発 > C++ > 非同期 C# コードで AggregateExceptions を処理するときにエラー情報の損失を防ぐにはどうすればよいですか?

非同期 C# コードで AggregateExceptions を処理するときにエラー情報の損失を防ぐにはどうすればよいですか?

Barbara Streisand
リリース: 2025-01-12 15:51:43
オリジナル
294 人が閲覧しました

How Can I Prevent Losing Error Information When Handling AggregateExceptions in Asynchronous C# Code?

非同期 C# と AggregateExceptions の課題

await を使用して C# で非同期操作を操作する場合、障害が発生したタスクからの例外の管理には細心の注意が必要です。 await は通常、AggregateException 内で発生した最初の例外を再スローしますが、残念ながら後続の例外は失われます。この省略により、不完全なエラー報告が発生し、デバッグ作業が妨げられる可能性があります。

解決策: 例外の詳細を保持する

AggregateException 内に含まれるすべての例外の詳細を効果的に保持するために、カスタム拡張メソッドは堅牢なソリューションを提供します。

<code class="language-csharp">public static async Task WithAggregateExceptionHandling(this Task source)
{
    try
    {
        await source.ConfigureAwait(false);
    }
    catch (Exception ex)
    {
        // Preserve original exception context
        ExceptionDispatchInfo.Capture(source.Exception ?? new Exception("Task was cancelled or encountered an unknown error.")).Throw();
    }
}</code>
ログイン後にコピー

この拡張メソッドは、await 呼び出しを try-catch ブロック内にカプセル化します。 重要なのは、ExceptionDispatchInfo.Capture を使用して元の例外 (タスクがキャンセルされた場合はデフォルトの例外) を再スローし、スタック トレースを含む完全な例外コンテキストが確実に維持されるようにすることです。

実装例

このメソッドの統合は簡単です:

<code class="language-csharp">Task[] tasks = new[] { /* ... your tasks ... */ };
await Task.WhenAll(tasks).WithAggregateExceptionHandling(); // Rethrows AggregateException with full context</code>
ログイン後にコピー

このアプローチを採用することで、開発者は非同期 C# コードで AggregateExceptions を効果的に処理できるようになり、貴重なエラー情報の損失を防ぎ、より徹底的なエラー処理とデバッグを容易にすることができます。

以上が非同期 C# コードで AggregateExceptions を処理するときにエラー情報の損失を防ぐにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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