ホームページ > バックエンド開発 > C++ > AggregateException でタスクを待機しているときにすべての例外の詳細を保持するにはどうすればよいですか?

AggregateException でタスクを待機しているときにすべての例外の詳細を保持するにはどうすればよいですか?

Linda Hamilton
リリース: 2025-01-12 16:11:43
オリジナル
630 人が閲覧しました

How Can I Preserve All Exception Details When Awaiting a Task with AggregateException?

非同期操作と AggregateException: 例外情報を保持します

失敗したタスクを待機しているとき、await は通常、保存されている例外を再スローします。ただし、保存された例外が AggregateException の場合は、最初の例外が再スローされるだけです。

この問題を解決し、すべてのエラー メッセージを捕捉するには、次のベスト プラクティスを検討してください。

拡張メソッドを使用する

元の例外スタック トレースが存在する場合、それを保持する拡張メソッド WithAggregateException を作成できます。

<code class="language-csharp">public static async Task WithAggregateException(this Task source)
{
  try
  {
    await source.ConfigureAwait(false);
  }
  catch
  {
    // 检查取消的任务。
    if (source.Exception == null)
      throw;

    // 保留原始堆栈跟踪。
    ExceptionDispatchInfo.Capture(source.Exception).Throw();
  }
}</code>
ログイン後にコピー

この拡張メソッドを使用すると、タスクを待機し、詳細が保持された単一のエンティティとして AggregateException を処理できます。

次の例を考えてみましょう:

<code class="language-csharp">// 创建一个具有多个异常的任务。
var task = Task.FromException(new AggregateException(new Exception("异常 1"), new Exception("异常 2")));

// 使用扩展方法等待任务。
try
{
  await task.WithAggregateException();
}
catch (AggregateException ex)
{
  Console.WriteLine("捕获所有异常:");
  foreach (var innerEx in ex.InnerExceptions)
  {
    Console.WriteLine(innerEx.Message);
  }
}</code>
ログイン後にコピー

出力:

<code>捕获所有异常:
异常 1
异常 2</code>
ログイン後にコピー

この拡張メソッドを使用すると、タスクの待機中にすべての例外情報を保持できるため、エラーの詳細が誤って失われることがなくなります。

以上がAggregateException でタスクを待機しているときにすべての例外の詳細を保持するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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