我正在使用像这样的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。
答案 0 :(得分:2)
您应该检查GUILib是否有“未处理”异常的事件。
另一种方法是自己触发调试器:
System.Diagnostics.Debugger.Break();
代替或除了抛出异常。
答案 1 :(得分:1)
根据您感兴趣的例外情况,您可能会使用Debug-> Exceptions对话框走上正轨,除非您勾选所有 CLR例外,因此它抓住了一切。
您可以更好地过滤它:点击CLR例外条目旁边的[+]图标展开它,它会单独列出它们,然后您可以勾选特定的 - 或者以其他方式执行,并且勾选主要的一个以启用捕获调试器中的所有异常,然后取消勾选一些特定的异常(例如MyInternalNotReallyAnExceptionButJustAStatusCodeException * :-)。要轻松找到一个或两个特定异常,请单击“查找...”并键入部分名称 - 例如“NullR”将找到NullReferenceException。
*(是的,我不喜欢使用异常来报告状态信息 - 恕我直言的例外主要用于传递无法在投掷站点处理的失败)
答案 2 :(得分:0)
是否可以将异常处理移动到代理中?它最终可能会有一些冗余代码,但您应该能够将异常处理主体重构为函数。