图书馆吃掉了我的例外

时间:2011-04-02 10:09:03

标签: c# visual-studio-2008 exception

我正在使用像这样的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是一个遗留的lib,它捕获OnEveryFrame处理程序抛出的任何异常并将其打印到控制台,因此FooExceptions没有达到我的FooException处理程序,而对于BarExceptions,Visual Studio调试器不会中断。

我通过转到 Debug - >为BarExceptions做了调试器中断。 “公共语言运行时异常”框中的例外并检查抛出中断(而不仅仅是“中断处理”)框。这有效,但这意味着当任何异常被抛出时,VS现在会中断,即使处理程序已经捕获它。所以我不能对非致命的东西使用例外。

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

BTW,该库是qt4dotnet / Qt Jambi。

3 个答案:

答案 0 :(得分:2)

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

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

     System.Diagnostics.Debugger.Break();

代替或除了抛出异常。

答案 1 :(得分:1)

根据您感兴趣的例外情况,您可能会使用Debug-> Exceptions对话框走上正轨,除非您勾选所有 CLR例外,因此它抓住了一切。

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

*(是的,我不喜欢使用异常来报告状态信息 - 恕我直言的例外主要用于传递无法在投掷站点处理的失败)

答案 2 :(得分:0)

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