仅从特定模块引发异常时中断(Visual Studio 2017及更高版本)

在Visual Studio 2015中,引入了新的异常设置窗口,该窗口提供了一种快速的方法,可以将调试器配置为在抛出异常时中断。作为窗口更新的一部分,仅仅按异常类型过滤并不总是足够好,您需要对调试器何时中断抛出的异常进行更细粒度的控制。因此,在Visual Studio 2017中,引入了一个新功能,允许您控制抛出异常时的中断,而不仅仅是类型。您可以将模块名条件添加到异常中,以便只在您关心的模块引发异常时中断。

概述-中断和抛出

实际情况是,您需要处理代码中的异常,以便在出现意外情况时应用程序能够正常降级,但作为开发人员,您仍然需要找出应用程序遇到这些意外情况的原因。因此,您希望在抛出异常时调试应用程序,而不必在代码中导航,以确定处理的是什么异常以及处理的位置。当调试涉及已处理异常的问题时,可以使用“异常设置”窗口告诉调试器在引发异常时中断。这允许您在处理异常之前在调试器下停止并检查异常。您可以对特定异常类型或整个异常类别执行此操作。

如果始终调试一个程序,并且将异常类别设置为在抛出时中断,则可以在程序执行过程中尽早捕获与异常相关的问题,这有助于确保以正确的方式处理每个异常。

但是,有时抛出的异常太多,无法使这种调试技术有价值,因为在找到感兴趣的代码之前,必须对每个异常按“继续”。这些“可忽略”异常通常在异常不是致命的代码中遇到。例如,你的应用程序试图读取存储的设置,如果它无法读取存储的设置,它只会回到默认行为。这些非致命异常经常出现在第三方库中、未处于活动开发中的代码中,甚至出现在与当前调试任务无关的另一个团队拥有的代码中。通过在抛出的异常上引入模块名条件,现在可以限制调试时遇到的不必要中断的数量。

在Visual Studio 2017中,只支持一种类型的条件,“模块名”条件。对于任何模块,都可以决定是只中断该模块抛出的异常(模块名等于),还是忽略中断该模块抛出的异常(模块名不等于)。

示例-添加模块名称条件

在本例中,每次启动应用程序时,我都使用一个设置库(Settings library.dll),该库根据注册表项值加载用户的设置。如果还没有应用任何设置(这种情况经常发生),我将抛出并处理产生的参数异常(有很多异常)。我正在调试异常,在抛出异常并频繁命中这些异常时会中断。
我知道我的设置库正在做它的工作,我不需要中断在该模块中发生的任何异常。

注意:在上面的屏幕截图中,您可以看到新的异常助手。在此处阅读有关使用新异常帮助程序的更多信息。我可以选择选中“异常帮助程序”的“异常设置”部分中的复选框,然后仅对System.ArgumentExceptions选中,我不会打断SettingsLibrary.dll。在本例中,我希望将该条件应用于整个.NET异常类别。
因此,我在“异常设置”窗口中添加了一个模块名条件,这样就不会中断从设置库(它自己的模块)抛出的任何异常。

  • 打开调试->窗口->异常设置
  • 单击异常类型或类别
  • 右键单击该异常并选择“编辑条件”
  • 或者单击工具栏中的蓝色编辑铅笔

从“编辑条件”对话框中:

  • 使用“Equals”或“Not Equals”设置条件(例如,“Module Name Not Equals*Settings*”)
  • 在关键字前后使用星号(*)作为通配符,以与包含该关键字的模块名称匹配
  • 单击“确定”设置条件

当我按OK时,我的条件被设置,我可以在Conditions列下的Exception Settings窗口中看到它。

当我对一个类别设置条件时,它会在每次编辑该类别并按“确定”时将该条件应用于该类别中的所有子类别。现在我的条件已经设置好了,在调试时不会中断设置库中抛出的异常。

模块名称条件的一些附加功能包括:

  • 在特定异常类型上设置条件(例如System.ArgumentException)
  • 使用指定模块的确切名称(例如“SettingsLibrary.dll”)
  • 使用“添加条件…”链接添加多个“模块名不等于”条件

 

posted on 2020-05-18 08:48  活着的虫子  阅读(917)  评论(0编辑  收藏  举报

导航