C# 如何了解System.Windows.Forms.dll中System.InvalidOperationException的详细信息?

C# 如何了解System.Windows.Forms.dll中System.InvalidOperationException的详细信息?,c#,.net,exception,C#,.net,Exception,在运行我的应用程序时,我在VisualStudio的输出面板中找到下面的异常日志 System.Windows.Forms.dll中发生了类型为“System.InvalidOperationException”的首次意外异常 此应用程序的架构如下所示 第二个线程:将“将项目添加到listview”或“将项目更改为listview”命令排入队列 主线程:从队列中退出队列并执行每个命令定义的添加或更改操作 我想知道从调用的InvalidOperationException的详细信息, 但它只显

在运行我的应用程序时,我在VisualStudio的输出面板中找到下面的异常日志

System.Windows.Forms.dll中发生了类型为“System.InvalidOperationException”的首次意外异常

此应用程序的架构如下所示

  • 第二个线程:将“将项目添加到listview”或“将项目更改为listview”命令排入队列
  • 主线程:从队列中退出队列并执行每个命令定义的添加或更改操作
我想知道从调用的InvalidOperationException的详细信息, 但它只显示在输出面板上,所以我无法捕捉它来查看堆栈跟踪。
有办法知道吗?

尝试执行以下操作:

  • 在必要的位置添加断点
  • 右键单击断点并单击“命中时…”
  • 选中“打印消息”框,并使用它们显示的标记来显示所需的信息(例如,调用function、stacktrace、线程ID/名称、进程ID/名称等)
  • 如果您希望程序在打印消息后继续执行(即,您不希望它暂停在断点上),也请选中“继续执行”框

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



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

    请使用以下方法:

    try
    {
       //Some code here.
       //Also, set your breakpoints here.         
    }
    
    catch (InvalidOperationException exc)
    {
       MessageBox.Show(exc.ToString());
    }
    
    catch (Exception exception)
    {
       MessageBox.Show(exception.Message);
    }
    
    C#(和其他语言)中的异常处理从最特定的异常类型变为最不特定的异常类型。上面的示例还将在
    消息框中显示堆栈跟踪。

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

    您可以通过转到
    调试
    菜单,选择
    异常…
    并选中
    公共语言运行时异常
    旁边的
    抛出
    选项来执行此操作。无论在何处或是否处理.NET异常,只要抛出.NET异常,此操作就会中断


    这不会解决您的问题,但有助于识别问题。

    将整个应用程序包装在
    try
    /
    catch
    中?在调试器中运行它,并将其设置为在每次异常时中断?在整个程序.Main中设置try/catch,但它不能捕获InvalidOperationException。转到
    Debug->Exceptions…
    并选中
    公共语言运行时异常旁边的
    抛出的
    选项。谢谢!!!我做了异常设置,得到了异常的详细信息!详细信息通过更改异常设置后显示的visual studio对话框获取。我仍然无法捕获异常,但我的目标已达到。我猜您忘记了用锁保护队列。当主线程迭代队列时,需要防止工作线程修改队列。不要随意捕捉异常,这只会使您的代码以无法诊断的方式失败。谢谢,但我无法决定添加断点的好位置,因为我不知道异常是从何处产生的。如果是这样,我会设置一些断点,打印出当前执行函数的名称(
    $function
    是标记)并将“继续执行”框设置为true。将它们设置在您认为发生异常的前后位置,然后从那里缩小搜索范围(想想二进制搜索,只有断点)。正如您所建议的,我将catch(invalidooperationexception)设置到所有try/catch块中,但应用程序没有到达它……谢谢,我通过它获得了异常的详细信息!