Как сделать исключение, чтобы определить свое собственное сообщение в C #? - PullRequest
10 голосов
/ 23 декабря 2009

Я хочу определить пользовательское исключение, которое имеет два специальных свойства: 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?

Ответы [ 6 ]

25 голосов
/ 23 декабря 2009

Не уверен, что я понимаю ваш вопрос, но как насчет этого?

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

    private static string BuildMessage(Fields field, string value)
    {
       // return the message you want
    }
18 голосов
/ 23 декабря 2009

Переопределить это:

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

Как обсуждалось в комментариях, даже если вы сказали, что не хотите, чтобы сообщение в конструкторе, вы можете рассмотреть возможность предоставления пользователям возможности дополнительно передавать свое собственное сообщение конструктору вашего исключения и отображать его также .

4 голосов
/ 23 декабря 2009

Разве вы не можете просто вызвать базовый конструктор, создавая встроенное сообщение? Это полностью исключило бы сообщение.

 public FieldFormatException(string field, string value): 
         base(field.ToString() + value.ToString())
 {
    _fieldValue = value;
    _field = field;               
 }
3 голосов
/ 23 декабря 2009

Вы можете переопределить свойство Message.

Или создайте статический вспомогательный метод:

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

И используйте это в вызове конструктора базового класса:

public FileFormatException(string field, string fieldValue)
  : base(MakeMessage(field, fieldValue) { ... }
2 голосов
/ 23 декабря 2009

Я всегда добавляю свойство к своим пользовательским исключениям, чтобы я мог изменить содержимое сообщения. На самом деле, я добавляю два свойства: одно для текста сообщения, которое будет отображаться пользователю (DisplayMessage), и другое для регистрации многих деталей об исключении (LogMessage), таких как информация о пользователе, подробности вызова sproc, детали ввода данных, и т. д.

Затем вы можете оставить свойство сообщения в покое.

2 голосов
/ 23 декабря 2009

Вы можете переопределить Exception.Message (это виртуально).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...