【问题标题】:How to know details of System.InvalidOperationException in System.Windows.Forms.dll?如何知道 System.Windows.Forms.dll 中 System.InvalidOperationException 的详细信息?
【发布时间】:2022-03-11 03:40:08
【问题描述】:

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

System.Windows.Forms.dll 中发生了“System.InvalidOperationException”类型的第一次机会异常

这个应用的架构师如下。

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

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

【问题讨论】:

  • 将整个应用程序包装在try/catch?在调试器中运行它并设置为在每个异常时中断?
  • 在整个 Program.Main 中设置 try/catch,但无法捕获 InvalidOperationException。
  • 转到Debug -> Exceptions... 并勾选Common language Runtime Exceptions 旁边的Thrown 选项。
  • 谢谢!!!我做了异常设置,我得到了异常的详细信息!更改异常设置后显示的 Visual Studio 对话框获取详细信息。我仍然无法捕捉到异常,但我的目标已经达到。
  • 我猜你忘了用锁保护队列。需要防止工作线程在主线程迭代队列时修改队列。不要随便捕获异常,这只会使您的代码以无法诊断的方式失败。

标签: c# .net exception


【解决方案1】:

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

您可以通过转到Exception Settings窗口并选中“Break When Thrown”下Common Language Runtime Exceptions旁边的复选框来执行此操作。

如果您没有看到“异常设置”窗口,您可以从顶部菜单的 Debug -> Windows -> Exception Settings 打开它strong>(还有一个键盘快捷键 Ctrl+Alt+E 可以打开它。

无论何时抛出 .NET 异常,这都会中断,无论它在哪里处理或是否被处理。

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

【讨论】:

    【解决方案2】:

    像这样使用 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 中显示堆栈跟踪。

    【讨论】:

    • 按照你的建议,我将 catch(InvalidOperationException) 设置到所有 try/catch 块中,但应用程序没有到达它...
    【解决方案3】:

    尝试执行以下操作:

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


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


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

    【讨论】:

    • 谢谢,但我无法确定添加断点的好地方,因为我不知道异常是从哪里引起的。
    • 如果是这种情况,我会设置一些断点来打印当前执行函数的名称($FUNCTION 是令牌)并将“继续执行”框设置为 true。将它们设置在您认为异常发生之前和之后的位置,然后从那里缩小搜索范围(考虑二进制搜索,仅使用断点)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-13
    • 2018-08-26
    相关资源
    最近更新 更多