【发布时间】:2019-08-20 16:28:20
【问题描述】:
我正在尝试处理任务内部的异常,到目前为止,我查看了以下链接:
How to handle Task.Run Exception
如果我是正确的,他们建议以下代码不会导致用户未处理的异常。
public async void TestMethod()
{
try
{
await Task.Run(() => { throw new Exception("Test Exception"); });
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
但是,我收到了用户未处理的异常。我想在任务之外处理异常,这样我就可以避免编写代码来从不同的线程更改 UI。我究竟做错了什么?
这是异常的打印屏幕:
【问题讨论】:
-
你为什么要抓
AggregateException?AggregateException被Task.Wait()和Task.Result抛出,但您正在等待您的任务。你可以直接捕获异常——catch (Exception ex) { Console.WriteLine(ex.Message); } -
@canton7 嘿,是的,我最初只是抓住了你所说的一个例外。那只是我尝试了与我在问题中发布的链接之一不同的事情
-
第一个链接在 pre-async/await 世界的上下文中讨论了
Task:您可以看到他们所有的示例都使用Task.Wait()/Task.Result。你的第二个链接有答案try { await ... } catch (Exception e) { ... } -
什么问题?我刚刚测试了新代码,它完全按预期工作(它将“测试异常”写入控制台)
-
看起来 Visual Studio 配置为中断所有异常,甚至是已处理的异常。只需按 F5,它可能会继续执行到
catch块。
标签: c# multithreading asynchronous