在 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 事件