代码之家  ›  专栏  ›  技术社区  ›  Tigraine

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

  •  2
  • Tigraine  · 技术社区  · 16 年前

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

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

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

    4 回复  |  直到 14 年前
        1
  •  3
  •   Community Mohan Dere    9 年前

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

    有 几种说服Visual Studio您的库不是用户代码的方法。一种是简单地编译一个没有PDB文件的发布版本。另一个方法是 mark your code with debuggernousercodeattribute. >。

    有一个 演示项目 演示这个东西: https://bitback.org/rstarkov/demonousercode/src 注意mylibrary中的方法是如何用非用户代码属性标记的。即使您告诉Visual Studio停止“引发”所有异常,它仍将跳过MyLibrary中的异常。

    为了它的价值,我不认为你所做的是错的。正确配置调试器是一个问题。不使用任何异常,仅仅是因为有人将调试程序设置为“停止所有操作”,这听起来并不完全正确。

    Sual 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停止“抛出”所有异常,它仍然会跳过MyLibrary中的异常。

    为了它的价值,我不认为你所做的是错的。正确配置调试器是一个问题。不使用任何异常,仅仅是因为有人设置了他们的调试器来停止所有操作,这听起来不完全正确。

        2
  •  2
  •   Richard    16 年前

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

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

    只有避免将异常用于非错误处理目的(从您的描述来看,您的库似乎违反了此准则)。

        3
  •  1
  •   ertan    16 年前

    不,你不能阻止。

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

        4
  •  0
  •   Community Mohan Dere    9 年前

    这是的半克隆 this question.

    请注意,当我使用VS2010时,这些属性中没有一个显示了您所要求的。

    您可以做的是,确保始终发送相同的自定义异常类型,即tigrainename.tigraineexception,然后指示用户转到异常对话框(ctrl+alt+e),单击“添加”,编写“tigrainename.tigraineexception”,按Enter键,然后取消选中特定异常的复选框。

    推荐文章