【发布时间】:2012-05-28 14:04:44
【问题描述】:
假设以下情况。表单有一个按钮,单击该按钮可启动后台工作人员。在 RunWorkerCompleted 事件处理程序中有一段代码会引发未处理的异常。表单从 Application.Run 方法启动。
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
}
private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
throw new Exception();
}
private void button_Click(object sender, EventArgs e)
{
backgroundWorker.RunWorkerAsync();
}
}
问题是 Visual Studio 在 Application.Run 调用处中断,而不是在 FormMain.backgroundWorker_RunWorkerCompleted 方法中的“throw new Exception()”处中断。最重要的是,真正的异常被 TargetInvocationException 包裹,调用堆栈被缩减为 Program.Main 方法,因此无法检查导致异常的代码。
如何防止这种包装?我做错了什么吗?
从 TargetInvocationException 提供的调用堆栈来看,调用方法堆积如山,对于我对消息循环的基本理解和对线程的不太基本的理解来说太多了。
编辑: 我知道 TargetInvocationException 中有 InnerException 属性,并且可以通过查看那里来跟踪错误,但这不是问题。问题是如何在使用 TargetInvocationException 包装真正的异常之前停止 Visal Studio,以便我可以使用 VS IDE 提供的所有这些不错的调试功能。
【问题讨论】:
-
在
TargetInvocationException的情况下,InnerException属性包含基础异常。 -
@Damith 我知道,这不是我要问的。我已编辑问题以防止出现此类答案。
标签: .net backgroundworker targetinvocationexception