什么是它抓不到的try/catch
?
如果他不能,也许其他东西可以?
我有以下问题:System.Private.CoreLib.dll 中类型为“System.AggregateException”的未处理异常
try/catch
虽然在我看来他已经捕捉到了一切,但在这里不起作用……
我曾经问过关于这种行为的问题,但这还不够StackTrace
,他们让我相信我нехорошее слово
忘记在某个地方使用它await
,这就是为什么一切都失败了,因为AggregareExeption
直到今天,我还以为我有一个门框,但我根本找不到,我通过重新启动应用程序来解决它。
即使是这样的错误,你又如何处理呢?
该库 99.9% 的工作正常,如果发生问题,我希望只需重新启动使用具有类似严重错误的库的组件。
捕获异常看起来像这样:
try
try
catch
也就是说,调用会更深入,异常会使用调用历史记录作为返回原始调用点的路径沿着调用堆栈返回。
如果抛出的异常没有被发现
catch
捕获它,则该异常将变为未处理并且应用程序崩溃。这个逻辑非常严格,不会出错。也就是说,如果从调用堆栈内的块
try
抛出异常,则catch (Exception)
保证会捕获该异常。现在为什么看起来出现的异常可能不会被调用堆栈内部捕获,例如我们以这个方法为例
我们会打电话给他
这个异常不会被捕获,原因如下:
Method()
SynchronizationContext
启动异步等待10ms,将异步方法的一段延续添加到同步上下文中( )Method()
从第二行代码(即 where 行之后)调用延续方法await
也就是说,这里的块
catch
将在抛出异常之前按时间顺序传递。解决方案是创建一个方法async Task
并添加await Method()
.然后catch
它将在异步上下文中正常工作。直接回答这个问题,设计
try-catch
绝对可以捕获任何异常,并且不可能绕过它。那些似乎没有被捕获的异常发生在不是从 block 开始try
,而是从同步上下文异步开始的调用堆栈上。而且,如果异步方法没有 returnTask
,那么异常不会在 this 中被捕获Task
,而是被抛出到调用上下文中并被应用程序终止。也就是说,如果你在方法签名中替换async void
为async Task
,并且await
调用时不添加,那么异常根本不会报错,会被抛入深渊,因为它会被捕获在里面Task
,而你不是以任何方式使用。因此,您需要更加小心异步方法;您需要添加
await
和避免async void
.如果无法避免,则应async void
将方法内的所有代码包装在try-catch(Exception)
.我会告诉你一个秘密,从技术上来说,从上面的示例中捕获异常仍然是可能的,但要做到这一点,你必须编写自己的同步上下文。