在异步方法中捕获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 Thrown
了Break When Thrown
。 检查您的exception窗口( Debug -> Windows -> Exception Settings
)。
当你在async
方法上使用返回类型的void
时,你无法从方法中获取任何类型的信息 – 它会被点燃并忘记。 除了在特定情况下,这是不好的做法。 始终让异步方法返回Task
或Task
:
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
在此处解包任务,但在应用程序入口点中不允许这样做。