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/