Подтвердить что ты не робот

Как исключение определяет его собственное сообщение в С#?

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Отменить его:

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

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

Ответ 3

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

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

Ответ 4

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

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

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

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

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

Ответ 5

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

Ответ 6

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

Затем вы можете оставить свойство Message в покое.