防止调试器中断第三方库中的所有异常

时间:2010-08-22 10:32:16

标签: .net debugging exception

我维护一个开源库,在递归方法调用期间内部使用异常。异常收回调用堆栈,在某些情况下处理,而在其他情况下,它将返回给调用者。

我们现在遇到的问题是某些用户正在运行带有“Halt on ALL exceptions”选项的Visual Studio Debugger,因此他们的调试器将在我们的代码正常运行时停止运行。

除了告诉用户禁用该设置之外,还有什么方法可以防止这种情况发生吗?比如,将一些属性应用于代码可能?

4 个答案:

答案 0 :(得分:3)

这是非常可能的。您需要做的就是让Visual Studio将相关代码视为非用户代码,然后启用“只是我的代码“调试器设置中的选项:

enter image description here

several ways of convincing Visual Studio that your library is not user code。一种是简单地编译没有PDB文件的发布版本。另一个是mark your code with DebuggerNonUserCodeAttribute

有一个演示项目显示了这些内容: https://bitbucket.org/rstarkov/demononusercode/src - 请注意MyLibrary中的方法是如何使用非用户代码属性标记的。即使您告诉Visual Studio停止所有异常的“Thrown”,它仍将跳过MyLibrary中的异常。

对于它的价值,我不会考虑你做错了什么。这是一个正确配置调试器的问题。没有使用任何例外只是因为有人将调试器设置为停止在所有内容上并不完全正确。

答案 1 :(得分:2)

我不相信有任何办法可以阻止“停止一切例外”这样做。

  

除了告诉用户禁用该设置外,还有什么办法可以防止这种情况发生吗?

只有避免使用异常进行非错误处理(根据您的描述,几乎听起来您的图书馆违反了此指南)。

答案 2 :(得分:1)

不,你不能阻止它。

我建议您将设计更改为使用返回代码/类而不是异常。递归方法调用的异常非常昂贵。

答案 3 :(得分:0)

这是this question.

的半克隆

请注意,当我使用VS2010时,没有任何建议的属性似乎完成了你所要求的。

你可以做的是确保你总是发送相同的自定义异常类型,即TigraineNamespace.TigraineException,然后指示你的用户进入Exceptions对话框(Ctrl + Alt + E),点击“Add” ,写下“TigraineNamespace.TigraineException”,按Enter键,然后取消选中特定例外的复选框。