在符合ca1032的情况下设置异常上的字段

本文关键字:异常 字段 设置 情况下 ca1032 | 更新日期: 2023-09-27 18:15:08

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,类更详细,因为我必须有一个支持变量(或对属性没有null检查),NewException是可变的。

我注意到"When to suppress"一节说:

当违反该规则是由于对公共构造函数使用不同的访问级别而导致的,则可以安全地抑制该规则的警告。

我不太确定这是什么意思。这是不是说我可以写这样的东西,然后不做分析?
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));
  ...
}

在符合ca1032的情况下设置异常上的字段

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

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

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

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

由于您有自定义的情况,(在我看来)您可能应该抑制此警告。为了与需求保持一致,您仍然可以使用这组构造函数:

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