Aimon Z. Asked:2020-08-11 02:50:49 +0000 UTC2020-08-11 02:50:49 +0000 UTC 2020-08-11 02:50:49 +0000 UTC 调试器不抛出异常 772 调试器不会在异步方法中发出有关异常的警告,该方法只是停止执行。 public async Task Test() { List<string> a = null; a.Count; // и дальше код не выполняется MessageBox.Show("Сообщение"). } c# 2 个回答 Voted Aziz Umarov 2020-08-11T02:59:08Z2020-08-11T02:59:08Z 这样做,将调用包装在 try catch 中 public async Task Test() { .... } public async void doTest() { try { await Test(); } catch (Exception ex) { ... } } Best Answer Alexander Petrov 2020-08-13T20:15:00Z2020-08-13T20:15:00Z 如果您在不等待的情况下调用异步方法 Test(); // или var task = Test(); 那么异常不会因为以下原因被抛出:它不知道它应该被抛出的确切位置。毕竟调用了这个方法之后,代码的执行就走的更远了。许多其他的方法可能已经被调用,当前的方法可能已经退出,等等。因此,任何地方都可能抛出异常。这将使调试变得更加困难 - 去猜测下一次在哪里等待。 并且将调用包装在 try-catch 中绝对不会做任何事情。 这就是为什么在单独的线程/任务中发生的异常保留在其中,直到显式接收或等待结果。可以通过以下方式之一完成: await task task.Wait() task.Result task.GetAwaiter().GetResult() 在这种情况下,如果任务内部发生异常,就会在这个地方抛出异常。在哪里捕获它,在哪里放置 try-catch 是合乎逻辑且清晰的。 文档链接:异常处理
这样做,将调用包装在 try catch 中
如果您在不等待的情况下调用异步方法
那么异常不会因为以下原因被抛出:它不知道它应该被抛出的确切位置。毕竟调用了这个方法之后,代码的执行就走的更远了。许多其他的方法可能已经被调用,当前的方法可能已经退出,等等。因此,任何地方都可能抛出异常。这将使调试变得更加困难 - 去猜测下一次在哪里等待。
并且将调用包装在 try-catch 中绝对不会做任何事情。
这就是为什么在单独的线程/任务中发生的异常保留在其中,直到显式接收或等待结果。可以通过以下方式之一完成:
在这种情况下,如果任务内部发生异常,就会在这个地方抛出异常。在哪里捕获它,在哪里放置 try-catch 是合乎逻辑且清晰的。
文档链接:异常处理