読者です 読者をやめる 読者になる 読者になる

C# 5.0 async awaitと例外処理

EDIT 2014.2.15 今見るとasync/awaitで例外処理がまるでできない的に書いていますが、これは悪い例ですので。こような記事Async/Await - 非同期プログラミングのベスト プラクティス参照してください。



asyncメソッドの外側で例外がキャッチできません。

static void Main(string[] args)
{
    try
    {
        FuncAsync();
        Console.ReadLine();
    }
    catch (InvalidOperationException e)
    {
        Console.WriteLine(e);//ここでキャッチできない!
    }
}

static async void FuncAsync()
{
    throw new InvalidOperationException("例外FuncAsync!");
    int r = await Task.Run<int>(() => Worker());
}

static int Worker()
{
    return 99;
}

上のように書いたMain()のtry/catchでは例外をキャッチできず、未処理例外になってしまいます。
これまた、落とし穴になりがちですな。
MSDNとかでもasyncメソッド内の例外が呼び出し側で素直にキャッチできないことは、あまり書いてないような。
async/awaitの便利さは確かにわかるのですが、トリッキーな仕組みの上に成り立ってることでもあるので、もうちょっと副作用とかも周知徹底してほしいものです。