如何让异常在C#中定义自己的消息?

如何让异常在C#中定义自己的消息?,c#,.net,exception,C#,.net,Exception,我想定义一个自定义异常,它有两个特殊属性:Field和FieldValue,我想从异常构造函数中的这两个值生成消息。不幸的是,消息是只读的 这就是我所拥有的,但它仍然需要传递消息 public class FieldFormatException: FormatException { private Fields _field; private string _fieldValue; public Fields Field{ get

我想定义一个自定义异常,它有两个特殊属性:Field和FieldValue,我想从异常构造函数中的这两个值生成消息。不幸的是,消息是只读的

这就是我所拥有的,但它仍然需要传递消息

    public class FieldFormatException: FormatException
    {
        private Fields _field;
        private string _fieldValue;
        public Fields Field{ get{ return _field; } }
        public string FieldValue { get { return _value; } }
        public FieldFormatException() : base() { }
        private FieldFormatException(string message) { }
        public FieldFormatException(string message, Fields field, string value): 
            base(message)
        {
            _fieldValue = value;
            _field = field;               
        }
        public FieldFormatException(string message, Exception inner, Fields field, string value): 
            base(message, inner)
        {
            _fieldValue = value;
            _field = field;
        }
        protected FieldFormatException(System.Runtime.Serialization.SerializationInfo info,
              System.Runtime.Serialization.StreamingContext context): base(info, context){}
    }
如何将消息作为参数从构造函数中删除,然后根据Field和FieldValue的值设置消息?

覆盖它:

    public override string Message
    {
        get
        {
            return string.Format("My message: {0}, {1}", Field, FieldValue);
        }
    }

正如评论中所讨论的,即使你说你不希望在构造函数中有一个消息,你也可以考虑允许用户随意地将自己的消息传递给你的异常的构造函数并显示它。

你可以重写(它是虚拟的)。但是这个呢

    public FieldFormatException(Fields field, string value): 
        base(BuildMessage(field, value))
    {
    }

    private static string BuildMessage(Fields field, string value)
    {
       // return the message you want
    }

您可以覆盖消息属性

或创建静态辅助对象方法:

private static string MakeMessage(....) {
  return "Message from parameters of this method";
}
并在基类构造函数调用中使用:

public FileFormatException(string field, string fieldValue)
  : base(MakeMessage(field, fieldValue) { ... }

您是否可以通过内联构造消息来调用基本构造函数?这将完全忽略这一信息

 public FieldFormatException(string field, string value): 
         base(field.ToString() + value.ToString())
 {
    _fieldValue = value;
    _field = field;               
 }

我总是向自定义异常添加属性,以便更改消息内容。实际上,我添加了两个属性:一个用于向用户显示消息文本(DisplayMessage),另一个用于记录有关异常的许多详细信息(LogMessage),例如用户信息、存储过程调用的详细信息、数据输入详细信息等


然后,您可以不使用Message属性。

我知道有些简单的东西我没有想到。谢谢您不应该这样做,因为拥有异常创建者可以定义的消息属性(FxCop将投诉afaik)是标准的设计准则。考虑重写ToStand,或者提供一个附加的构造函数,将默认值应用到消息属性。@亚历克斯:我们也知道这个FXCOP警告。我不认为每个异常都应该有所有这些必需的构造函数。由于FxCop,我们有许多构造函数的异常,这些异常永远不应该被使用(例如,因为它们不初始化某些字段)。因此,在这种情况下,我会抑制这些警告。就我个人而言,我更喜欢附加构造函数而不是重写ToString()。常量“My message”可以替换为可以从构造函数获取的消息(如果提供)。@Steinegger:同意,但如果可能符合“标准”,我会尝试这样做。在本例中:允许设置自定义消息。我刚想在发布问题后立即这样做。谢谢是的,这很有效。关键是使BuildMessage保持静态,并将字段和值传递给它。这真的很有帮助。非常感谢:)