在异步方法中捕获exception

我试图更熟悉异步/等待编程和exception处理。

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,但未在用户代码中处理。

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

如何在不破坏代码执行的Exception下捕获Exception

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

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

 private static async Task TestAsyncException() 

现在,您的main方法可以监听任务:

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

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