2

非同期 CTP に問題があり、例外を処理する正しい方法を見つけようとしています。以下のコードは私のプログラムをクラッシュさせます。私が知る限り、await呼び出し元のコンテキストで例外をキャッチして再スローする必要があるため、Not caught!ブロックは例外をキャッチする必要があります。

try {
  await TaskEx.Run(() => {
    throw new Exception();
  });
} catch {
  // Not caught!
}

助けや提案をありがとう。

4

3 に答える 3

3

(CTPではなく、ベータ版を使用しているためTaskExTask.

using System;
using System.Threading.Tasks;

class Test
{
    static void Main()
    {
        Task t = Foo();
        t.Wait();
    }

    static async Task Foo()
    {
        try
        {
            await Task.Run(() => { throw new Exception(); });
        }
        catch (Exception e)
        {
            Console.WriteLine("Bang! " + e);
        }
    }

出力:

Bang! System.Exception: Exception of type 'System.Exception' was thrown.
   at Test.<Foo>b__0()
   at System.Threading.Tasks.Task`1.InnerInvoke()
   at System.Threading.Tasks.Task.Execute()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter
            .HandleNonSuccessAndDebuggerNotification(Task task)
   at Test.<Foo>d__2.MoveNext()

同じコードはあなたのマシンで何をしますか?

于 2012-05-29T18:30:41.467 に答える
0

少しの再配置が機能するはずです。

  await TaskEx.Run(() => {
    try {
      throw new Exception();
    } catch {
      // Caught!
    }
  });

編集:

私も VS11 ベータ版を実行しているため、Jon Skeetと同じ結果が得られます。私は CTP について話すことはできません。

于 2012-05-29T18:31:27.883 に答える