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

时间:2009-12-22 21:25:03

标签: c# .net exception

我想定义一个具有两个特殊属性的自定义异常: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){}
    }

如何从构造函数中删除Message作为参数,然后根据Field和FieldValue的值设置消息?

6 个答案:

答案 0 :(得分:25)

不确定我是否理解你的问题,但是这个呢?

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

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

答案 1 :(得分:18)

覆盖它:

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

正如评论中所讨论的那样,即使您说您不想在构造函数中使用消息,您也可以考虑允许用户有选择地将自己的消息传递给异常的构造函数并显示其中的消息。

答案 2 :(得分:4)

你能不能通过内联构建你的消息来调用基础构造函数吗?这将完全留下信息。

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

答案 3 :(得分:3)

您可以覆盖Message属性。

或者创建一个静态辅助方法:

private static string MakeMessage(....) {
  return "Message from parameters of this method";
}

并在基类构造函数调用中使用它:

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

答案 4 :(得分:2)

你可以覆盖Exception.Message(它是虚拟的)。

答案 5 :(得分:2)

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

然后,您可以单独保留Message属性。