在 RunWorkerCompleted 中捕获未处理的异常 [关闭]

Posted

技术标签:

【中文标题】在 RunWorkerCompleted 中捕获未处理的异常 [关闭]【英文标题】:Catch Unhandled Exception in RunWorkerCompleted [closed] 【发布时间】:2021-09-13 13:52:05 【问题描述】:

假设我有如下部分代码:

Task.Run(() =>

   var backgroundWorker = new BackgroundWorker();
   backgroundWorker.RunWorkerCompleted +=  (sender, args) =>  throw new Exception("Catch me if you can...");
   backgroundWorker.RunWorkerAsync();
);

哪个事件处理程序可以捕获这个未处理的异常? 我尝试了 1- DispatcherUnhandledException,2- TaskScheduler.UnobservedTaskException,但无法处理。

【问题讨论】:

一个Backgroundworker in一个Task.Run?? 想法开始。观察到的行为是原因之一。 @Fildor OP 确实说过,"Assume",但有些事情让我相信这不是假设。 but I have a package that does this in the code,那么这不是一个假设。如果您无法控制它,请停止使用它;谁知道还有什么其他类型的垃圾。否则,请重新考虑您正在使用此代码做什么。 ^^ 所以,如果这是在第 3 方包中,那么您无能为力。我看到的唯一选择是:无论该包做什么 - a)自己编码 b)找到更好的包。 什么意思可以“展示”但不能“捕捉”? - 但无论如何 - 这只是我的意见 - 如果我在我正在使用的库中发现这样的代码,我会停止使用它。并在顶部提交错误报告。 【参考方案1】:

您应该在实际发生的RunWorkerCompleted 回调中捕获该事件:

backgroundWorker.RunWorkerCompleted +=  (sender, args) => 
 
    try 
        ...
    
    catch (Exception)  ... 

如果由于某种原因无法修改回调,您应该能够通过将事件处理程序连接到 AppDomain.CurrentDomain.UnhandledException 事件来捕获从 Task 抛出的异常。

请注意,在这种“最后手段”事件处理程序中,您可以/应该做的唯一有意义的事情是记录异常并关闭应用程序。

应在异常发生的地点/时间捕获和处理。

【讨论】:

以上是关于在 RunWorkerCompleted 中捕获未处理的异常 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

c# backgroundWorker 没有引发 ProgressChanged 或 RunWorkerCompleted 事件

WP7 为两个 BackgroundWorker 对象触发一个 RunWorkerCompleted 事件

BackgroundWorker RunWorkerCompleted 未在 UI 线程上执行

如何在 Promise 的回调中捕获未捕获的异常

BackgroundWorker 异常处理

捕获块未捕获异常