c# - 在遵守 CA 1032 的同时设置异常字段

标签 c# code-analysis

CA1032 规定每个异常都必须有以下构造函数:

public NewException()
public NewException(string)
public NewException(string, Exception)
protected or private NewException(SerializationInfo, StreamingContext)

但是,在这种情况下,我想捕获一些包含更多信息的 ExceptionContext。目前我的代码如下所示:

public class NewException : Exception {
  public NewException(ExceptionContext context) 
    : base() {
    if (context == null) throw new ArgumentNullException("context");
    this.context = context;
  }
}

如何确保在 NewException 上设置 ExceptionContext 同时仍符合 CA1032?

我可以在属性中设置上下文:

public class NewException : Exception {
  public ExceptionContext Context { get { /*get*/ } set { /*null check and set*/ } }
  /*Standard constructors...*/
}

但是现在没有办法让调用者设置一个ExceptionContext,这个类更加冗长,因为我必须有一个支持变量(或者没有对该属性进行空检查),并且NewException 是可变的。

我注意到“何时抑制”部分说:

It is safe to suppress a warning from this rule when the violation is caused by using a different access level for the public constructors.

我不是很清楚这是什么意思。这是说让我写这样的东西,然后打压分析吗?

public class NewException : Exception {
  public NewException(ExceptionContext context) 
    : this() {
    if (context == null) throw new ArgumentNullException("context");
    this.context = context;
  }

  private NewException() 
    : base() { }

  public NewException(ExceptionContext context, string message) 
    : this(message) {
    if (context == null) throw new ArgumentNullException("context");
    this.context = context;
  }

  private NewException(string message) 
    : base(message) { }
  ...
}

编辑/附加问题:我是否需要实现 NewException(ExceptionContext, SerializationInfo, StreamingContext) 或者 SerializationInfo 的目的是存储其他状态?

protected NewException(SerializationInfo info, StreamingContext context) 
  : base (info, context) {
  this.context = new ExceptionContext();
  this.context.Field1 = (T1)info.GetValue("Field1", typeof(T1));
  ...
}

最佳答案

该规则背后的逻辑是应该有一个标准的方法来构造异常对象。 (我承认我不理解该逻辑的目的,但这与此处无关。)可能还有其他特定于您的异常类的方法,但标准方法应该始终有效。

在你的情况下,如果你想构造一个 NewException 对象但没有任何 ExceptionContext 传递,你想要你的 NewException对象要做什么?

如果你想禁止它,那么你不希望你的异常对象表现得像标准异常对象,并且应该禁用关于该事实的任何警告。

如果你想允许这样做,那么你需要提供标准的构造函数重载,并为你的特定类做任何看起来最好的事情。

关于c# - 在遵守 CA 1032 的同时设置异常字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24995437/

相关文章:

java - 语法分析题

c# - 处理双工 WCF 服务中的客户端断开连接

c# - Microsoft 表单预览 API

c++ - 在命令行或从 CMake 指定用于 Visual Studio 代码分析的规则集

java - 使用 SonarQube 5.4 配置 CheckStyle

c++ - 找出在 Visual Studio 2012 中的 C++ 项目中从未调用过哪些代码

c# - 输入字符串的格式不正确

c# - 使用 postsharp 将方面应用到方面

c# - Windows 8 中的 Metro 应用程序如何与同一台计算机上的后端桌面应用程序通信?

c# - Visual Studio 中的变量命名约定是否有任何可以在开发时强制执行的规则?