如何在System.Windows.Forms.dll中了解System.InvalidOperationExcepti
本文关键字:System 了解 InvalidOperationExcepti dll Windows Forms | 更新日期: 2023-09-27 18:20:48
运行应用程序时,我在Visual Studio的"输出"面板中发现了以下异常日志。
System.Windows.Forms.dll 中首次出现类型为"System.InvalidOperationException"的异常
这个应用程序的架构师如下。
- 第二个线程:将"向列表视图添加项目"或"将项目更改为列表视图"命令加入队列
- 主线程:从队列中取出队列,执行每个命令定义的添加或更改操作
我想知道从调用的InvalidOperationException的详细信息,但它只显示在"输出"面板上,所以我无法捕捉到它来查看堆栈跟踪。有办法知道吗?
找到触发类似异常的的最佳方法是将调试器设置为中断所有异常。
您可以转到异常设置窗口,选中公共语言运行时异常旁边"抛出时中断"下的复选框。
如果您没有看到"异常设置"窗口,您可以从Debug->的顶部菜单打开它窗口->异常设置(还有一个Ctrl+Alt+E 无论在哪里或是否处理,只要抛出.NET异常,它就会中断。 这不会修复您的问题,但有助于识别它。
使用这样的try/catch:
try
{
//Some code here.
//Also, set your breakpoints here.
}
catch (InvalidOperationException exc)
{
MessageBox.Show(exc.ToString());
}
catch (Exception exception)
{
MessageBox.Show(exception.Message);
}
C#(和其他语言)中的异常处理从最特定的异常到最小特定的异常类型。上面的示例也将显示MessageBox
中的堆栈跟踪。
尝试执行以下操作:
- 在必要的位置添加断点
- 右键单击断点,然后单击"当命中.."
- 选中"打印消息"框,并使用它们显示的令牌来显示您想要的信息(例如,调用函数、堆栈、线程ID/name、进程ID/name等)
- 如果您希望程序在打印消息后继续执行(即您不希望它在断点上暂停),也可以选中"继续执行"框
正如其他人所建议的那样,您可能希望将此技术与try/catch
相结合。我不想重复别人的答案中提供的代码,但我会使用Brian的try/catch
来包装您的调用,然后使用此技术设置断点。
注意:您也可以使用此技术和"断点条件"来调用方法(即打印结果)和/或更改值(不过,后者有点像黑客,只有在完全必要并且您正在使用64位应用程序时才应该这样做)。在这种情况下,这些附加功能可能也有用,也可能不有用。