10

运行我的应用程序时,我在 Visual Studio 的输出面板中发现了下面的异常日志。

System.Windows.Forms.dll 中出现“System.InvalidOperationException”类型的第一次机会异常

该应用程序的架构师如下。

  • 第二个线程:将“将项目添加到列表视图”或“将项目更改为列表视图”命令排入队列。
  • 主线程:从队列中出列并执行每个命令定义的添加或更改操作。

我想知道调用 InvalidOperationException 的详细信息,但它只显示在输出面板上,所以我无法捕获它来查看堆栈跟踪。有办法知道吗?

4

3 回答 3

20

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

您可以通过转到Debug菜单,选择Exceptions...并选中 旁边的Thrown选项来执行此操作Common Language Runtime Exceptions。这将在任何时候引发 .NET 异常时中断,无论在何处或是否处理它。

这不会解决您的问题,但它会帮助识别它。

于 2013-07-02T18:56:41.227 回答
3

像这样使用 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

于 2013-07-02T17:53:24.560 回答
1

尝试执行以下操作:

  1. 在必要的位置添加断点
  2. 右键单击断点并单击“当命中时..”
  3. 选中“打印消息”框,并使用它们显示的标记来显示您想要的信息(例如,调用函数、堆栈跟踪、线程 ID/名称、进程 ID/名称等)
  4. 如果您希望程序在打印消息后继续执行(即您不希望它在断点处暂停),还要选中“继续执行”框


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


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

于 2013-07-02T17:47:21.187 回答