我有一些框架/ AOP代码可以记录来自内部更深层次的方法的异常......
try {
..invoke inner code...
}
catch (Exception e) {
log(e);
throw;
}
除了一件事之外,这很有用......当我的团队尝试在Studio中调试他们的代码时,他们只看到日志代码中发生的异常(因为它被处理,然后从那里抛出)。
有什么方法可以让Studio忽略我的代码正在捕获/抛出异常......或者在没有捕获它的情况下检查它上面的异常?
更新: 问题是我有框架代码阻止真实异常的正确断点被击中。我知道Visual Studio中的调试器能够进行细粒度配置,我希望这里的某个人能够提供比“31小时学习VS2010”更高级别的洞察力。我只是想同时记录内部代码中引起的异常,并在错误的站点发生中断而不启用“Break on All Exceptions”这将导致我的团队花5分钟按“继续”按钮每次他们推出应用程序(但这是另一个故事)。
更新2: 这里的主要问题是如何记录异常,但是调试器不能在我的记录器中的'throw'上停止,而是在初始异常上停止,而不会让抛出的所有异常停止调试器。
答案 0 :(得分:2)
实际上你可以在异常时使VS中断。转到“调试”菜单,单击“异常”并选中“公共语言运行时异常”复选框。现在,您将在抛出异常时获得调试中断 。
答案 1 :(得分:1)
我已经做了一些挖掘,1349613中的答案让我感觉良好。我添加了属性:
[DebuggerNonUserCode]
到我的日志类。现在,当内部调用的代码抛出异常时,调试器会忽略日志代码,并且它是Try / Catch块,并直接进入内部异常。
答案 2 :(得分:0)
在VB.NET中可以在不捕获异常的情况下检查异常,并且在此之前发生任何堆栈展开之前。虽然在抛出异常的时间与堆栈展开的时间之间做很多事情通常很危险,但是可以捕获异常然后在finally
块中使用它。也可以设置一个标志或其他指示器,让堆栈展开代码知道异常将被捕获的位置。不幸的是,后一种能力的有用性是有限的,因为(主要是语言强制的)反模式的代码捕获它需要对作出反应的异常,但是不能指望解决。例如,如果构造函数在创建了一些IDisposable
对象并将它们存储在字段中之后抛出异常,则构造函数必须通过清理它创建的字段来对异常做出反应,但是没有希望解决问题并正常返回。如果一个构造函数可能有多个返回点,那么在语义上可以说是更清晰:
try
{
... create IDisposables
}
finally(Exception ex)
{
if (ex != null)
this.Dispose();
}
比不得不说
try
{
... create IDisposables
}
catch(Exception ex)
{
this.Dispose();
throw ex;
}
因为前者会避免捕获一个它没有预期处理的异常。可以在VB中编写一个包装器方法来接受一对委托,并使用与上面finally(Exception ex)
相同的语义实现第二个方法,但遗憾的是C#本身不提供这样的工具。