沉默特定异常

Posted

技术标签:

【中文标题】沉默特定异常【英文标题】:Silence specific Exception 【发布时间】:2020-06-16 18:11:49 【问题描述】:

我在整个应用程序中都有很多 throw new NotImplementedExceptions()。现在我想让它们静音并改为显示自定义消息对话框。

为了捕捉它们,我正在使用:

AppDomain.CurrentDomain.FirstChanceException += (sender, eventArgs) =>

     if(eventArgs.Exception is NotImplementedException) 
        return;
     

但问题是仍然抛出异常。

当我在这段代码中捕获到这种类型的异常时,如何使抛出静音?

【问题讨论】:

您可以在异常窗口调试期间禁用特定异常 你不能只使用一个try catch,它捕获NotImplemented Exceptions,然后忽略它们吗? :) 我的意思是它脏得要命,但我假设你最终会摆脱它们? 这个想法不是在调试期间使异常静音。在将发布版本提供给客户后,将所有这些(暂时)静音。 关于 try/catch,我有很多 NotImplementedExceptions。我只是想检查是否有更简单、更清洁的方法来做到这一点。 【参考方案1】:

听起来你想做的事情是在调用一个你没有实现的方法时做一些比爆炸更好的事情。我不相信使用AppDomain.FirstChanceException 或相关的UnhandledException 是可能的。有一个good answer here 谈到了为什么简单地抑制异常是不可取的。

你可以做的是除了引发异常以将方法标记为未实现之外,还可以使用其他东西,比如在你还没有实现某些东西时调用一个显示你的消息的帮助器。如果需要,您可以使用#if 编译指示或ConditionalAttribute 切换到在非调试版本中实际抛出异常。无论如何,使用帮助程序抛出异常并不少见(例如,参见 BCL 中的 ThrowHelper,或我自己的项目中的 Throw),因为避免 throws 有一些好处。

这看起来像:

public void UnImplementedMethod()

  // rather than "throw new NotImplementedException("some message")"
  MyHelper.NotImplemented("some message");


// .... 

static class MyHelper

  [Conditional("DEBUG")]  
  public static void NotImplemented(string msg)
  
#if DEBUG // can use whatever configuration parameter
      MessageBox.Show("Not Implemented: "+ msg);
#else
      throw new NotImplementedException(msg);
#endif
  

您可以使用泛型参数来处理具有非 void 返回的未实现方法,但如果您不抛出异常,您必须决定实际返回什么。使用这种模式,您可以做任何您想做的事情,并且仍然可以轻松找到尚未实现的地方。

【讨论】:

感谢您的回答。我也考虑过这个选项,但由于我必须进行很多更改,我想避免它并检查是否可以使用 AppDomain 代替。但是,是的,如果最终我想要的东西是不可能的,我很乐意将你的答案标记为解决方案,因为它是一个正确而详细的答案:)

以上是关于沉默特定异常的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Visual Studio 测试中资源文件中的特定异常消息测试预期异常?

我在代码的特定部分遇到异常

Adplus fullonfirst 针对特定异常?

检查 PL/SQL 异常块中的特定错误代码

如何识别抛出的特定异常

SonarQube:(改为获取特定异常子类型的列表)