如何在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的详细信息,但它只显示在"输出"面板上,所以我无法捕捉到它来查看堆栈跟踪。有办法知道吗?

如何在System.Windows.Forms.dll中了解System.InvalidOperationExcepti

找到触发类似异常的的最佳方法是将调试器设置为中断所有异常。

您可以转到异常设置窗口,选中公共语言运行时异常旁边"抛出时中断"下的复选框。

如果您没有看到"异常设置"窗口,您可以从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中的堆栈跟踪。

尝试执行以下操作:

  1. 在必要的位置添加断点
  2. 右键单击断点,然后单击"当命中.."
  3. 选中"打印消息"框,并使用它们显示的令牌来显示您想要的信息(例如,调用函数、堆栈、线程ID/name、进程ID/name等)
  4. 如果您希望程序在打印消息后继续执行(即您不希望它在断点上暂停),也可以选中"继续执行"框


正如其他人所建议的那样,您可能希望将此技术与try/catch相结合。我不想重复别人的答案中提供的代码,但我会使用Brian的try/catch来包装您的调用,然后使用此技术设置断点。


注意:您也可以使用此技术和"断点条件"来调用方法(即打印结果)和/或更改值(不过,后者有点像黑客,只有在完全必要并且您正在使用64位应用程序时才应该这样做)。在这种情况下,这些附加功能可能也有用,也可能不有用。