在异步方法中捕获异常

时间:2016-04-26 12:53:54

标签: c# exception asynchronous exception-handling async-await

我正在尝试更熟悉异步/等待编程和异常处理。

static void Main(string[] args)
{
   TestAsyncException();
}

private static async void TestAsyncException()
{
    try
    {
        var result = await Task.Factory.StartNew(() => DoSomething());
        //do something with the result
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
    }
}

private static int DoSomething()
{
    throw new Exception("Exception was thrown!");
}

我希望Exception可以优雅地处理,但代码执行会停止,我会得到

  

在..中发生了'System.Exception'类型的异常,但却没有   用户代码处理。

但是当我继续执行代码时,Exception实际上被捕获(并且消息显示在Console)。

如何在不中断代码执行的情况下抓住Exception

1 个答案:

答案 0 :(得分:4)

首先,处理您的异常。我相信您看到代码停止执行并显示错误,因为您有异常Break When Thrown。检查您的例外窗口(Debug -> Windows -> Exception Settings)。

当您在void方法上使用返回类型async时,您无法从该方法中获取任何类型的信息 - 它会被发射并忘记。除了在特定情况下,这是不好的做法。始终让异步方法返回TaskTask<T>

private static async Task TestAsyncException()

现在,您的主要方法可以听取任务:

static void Main(string[] args)
{
    TestAsyncException().Wait(); // or whatever you want to do with the task
    Console.Read();
}

通常,您可以使用await在此处解包任务,但在应用程序入口点中不允许这样做。