【问题标题】:Library eats up my exceptions图书馆吞噬了我的例外
【发布时间】:2011-04-02 10:09:03
【问题描述】:

我正在使用这样的 GUI 库(伪代码):

static void ProcessFrame()
{
    // ...
    if(fooWentWrong) throw new FooException();
    if(barWentWrong) throw new BarException();
    // ...
}

static void Main()
{
    GUILib.OnEveryFrame += delegate { ProcessFrame(); };

    try
    {
        GUILib.MainLoop();
    }
    catch(FooException e) // we don't handle BarException
    {
        // handle exception.
    }
}

换句话说,GUILib 正在使用控制反转 - 它的主循环调用我的委托。

问题在于 GUILib 是一个遗留库,它捕获 OnEveryFrame 处理程序抛出的任何异常并将其打印到控制台,因此对于 FooExceptions 无法访问我的 FooException 处理程序,对于 BarExceptions,Visual Studio 调试器不会中断。

我已通过转到 Debug -> Exceptions 并检查 break on throw(而不仅仅是“break onhandled”)框来为 BarExceptions 中断调试器“公共语言运行时异常”。这可行,但这意味着 VS 现在会在 any 抛出异常时中断,即使处理程序会捕获它。所以我不能对非致命的东西使用异常。

有什么更好的方法让 VS 打破我的异常?我需要以某种方式解决图书馆的不良行为。

顺便说一句,库是 qt4dotnet / Qt Jambi。

【问题讨论】:

  • 不能对非致命的东西使用异常可能不是一件坏事......我通常一直这样编码。

标签: c# visual-studio-2008 exception


【解决方案1】:

您应该检查 GUILib 是否有“未处理”异常事件。

另一种方法是自己触发调试器:

     System.Diagnostics.Debugger.Break();

代替或除了抛出异常。

【讨论】:

  • 谢谢!我尝试将所有 ProcessFrame 包装在 try-catch 中,并在 catch 中调用 Debugger.Break()。但这并不能告诉调试器它正在中断由于异常,因此 VS 调试器不会导航到 引发异常的地方(可能很深在某处的调用堆栈中)。事实上,当我们点击 Debugger.Break() 时,堆栈已经展开,例如“调用堆栈”窗口不显示导致引发异常的函数。
  • 另外,我不想将 Debugger.Break() 放在实际的异常 throwing 站点,因为它甚至可能不是 my引发异常的代码(可能是例如图像加载库)。
【解决方案2】:

根据您感兴趣的异常,您可能通过使用“调试”->“异常”对话框走在正确的轨道上,只是您要勾选 所有 CLR 异常,因此它会捕获一切。

您可以更好地过滤它:单击 CLR 异常条目旁边的 [+] 图标将其展开,它会单独列出它们,然后您可以只勾选特定的 - 或以其他方式进行,然后勾选主要的以启用在调试器中捕获所有异常,然后取消勾选一些特定的异常(例如 MyInternalNotReallyAnExceptionButJustAStatusCodeException* :-)。要轻松找到一个或两个特定异常,请单击 Find... 并输入部分名称 - 例如“NullR”将找到 NullReferenceException。

*(是的,我不喜欢使用异常来报告状态信息的想法 - 恕我直言,异常应该主要用于传递无法在 throw 现场处理的故障)

【讨论】:

    【解决方案3】:

    是否可以将异常处理转移到委托中?它可能最终会出现一些冗余代码,但您应该能够将异常处理主体重构为一个函数。

    【讨论】:

    • 你的意思是把异常处理移到ProcessFrame中?当然,我已经这样做了,但问题是我不想想要处理某些异常 - 我希望它们到达 Main 的末尾,因此 Visual Studio 看到异常未处理,和中断,以便我可以使用异常助手(调用堆栈、本地、异常消息等)。
    猜你喜欢
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 2013-02-11
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    • 1970-01-01
    相关资源
    最近更新 更多