在符合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));
...
}
该规则背后的逻辑是应该有一种标准的方法来构造异常对象。(我承认我不理解这种逻辑的目的,但这与此无关。)也可能有特定于异常类的其他方法,但标准方法应该始终有效。
在你的例子中,如果你想构造一个NewException
对象,但没有任何ExceptionContext
要传递,你想要你的NewException
对象做什么?
如果你不允许,那么你不希望你的异常对象表现得像标准的异常对象,并且应该禁用任何关于这个事实的警告。
如果你想允许这样做,那么你需要提供标准的构造函数重载,并为你的特定类做任何看起来最好的事情。
由于您有自定义的情况,(在我看来)您可能应该抑制此警告。为了与需求保持一致,您仍然可以使用这组构造函数:
public NewException(ExceptionContext)
public NewException(ExceptionContext, string)
public NewException(ExceptionContext, string, Exception)
protected or private NewException(ExceptionContext, SerializationInfo, StreamingContext)