Добавление дополнительной информации в пользовательское исключение

StackOverflow https://stackoverflow.com/questions/48773

  •  09-06-2019
  •  | 
  •  

Вопрос

Я создал специальное исключение для очень конкретной проблемы, которая может пойти не так.Я получаю данные из другой системы и вызываю исключение, если оно выходит из строя при попытке проанализировать эти данные.В свое специальное исключение я добавил поле под названием «ResponseData», чтобы точно отслеживать, что мой код не смог обработать.

В пользовательских исключениях, таких как это, должны ли эти дополнительные данные ответа помещаться в «сообщение» исключения?Если это дойдет до этого, сообщение может быть огромным.Я как бы хочу, чтобы они были там, потому что я использую Elmah, и именно так я могу получить эти данные.

Итак, вопрос либо в следующем:- Как я могу заставить Elmah записать дополнительную информацию из поля в пользовательском исключении или - должны ли дополнительные детали исключения перейти в свойство «Сообщение»?

Это было полезно?

Решение

Вы не должны заполнять .Message с отладочной информацией, а скорее с кратким и полезным фрагментом текста.

http://msdn.microsoft.com/en-us/library/system.Exception.message.aspx

Текст Сообщения должен полностью описывать ошибку и по возможности объяснять, как ее исправить. Значение свойства Message включается в информацию, возвращаемую ToString.

Свойство Message задается только при создании исключения.Если конструктору текущего экземпляра не было передано сообщение, система предоставляет сообщение по умолчанию, отформатированное с использованием текущего языка и региональных параметров системы.

[..]

Примечания для наследников:

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

Сообщение об ошибке должно быть локализовано.

Данные ответа не могут считаться описанием.

Не будучи знакомым с elmah, я не могу сказать вам, как продлить Exception класс во время его использования.Реализует ли elmah собственный подкласс для Exception?Или интерфейс?Можете ли вы создать подкласс самостоятельно?

Другие советы

В пользовательских исключениях, таких как этот, должны ли эти дополнительные данные ответа перейти в исключение «Сообщение»?

Нет, как Сёрен уже отметил.Однако ваш тип исключения может переопределить ToString и разумно добавить туда информацию об ответных данных.Это совершенно нормальная практика, которой следуют многие типы исключений в BCL (библиотеке базовых классов), поэтому вам не придется плыть против течения.Например, взгляните на System.IO.FileNotFoundException.ToString реализация в SSCLI (Ротор):

public override String ToString()
{
    String s = GetType().FullName + ": " + Message;

    if (_fileName != null && _fileName.Length != 0)
        s += Environment.NewLine + String.Format(Environment.GetResourceString("IO.FileName_Name"), _fileName);

    if (InnerException != null)
        s = s + " ---> " + InnerException.ToString();

    if (StackTrace != null)
        s += Environment.NewLine + StackTrace;

    try
    {
        if(FusionLog!=null)
        {
            if (s==null)
                s=" ";
            s+=Environment.NewLine;
            s+=Environment.NewLine;
            s+="Fusion log follows: ";
            s+=Environment.NewLine;
            s+=FusionLog;
        }
    }
    catch(SecurityException)
    {

    }
    return s;
}

Как видите, он добавляет содержимое FusionLog имущество, которое представляет собой дополнительный информация в случае сбоев нагрузки сборки.

Как я могу заставить Эльму записать дополнительную информацию из поля в пользовательском исключении

ЭЛЬМА сохраняет результат вызова ToString об исключении в качестве подробной информации об ошибке, поэтому, если у вас есть ToString Если реализовать, как предписано, информация будет зарегистрирована без дальнейшей работы.Единственная проблема заключается в том, что зарегистрированные данные будут неструктурированный текст.

Класс Exception содержит словарь (я думаю, с именем Data), который вы можете использовать для связи пользовательских данных с ванильным исключением.

Я не совсем понимаю вопрос, но вы, кажется, спрашиваете, что делать с дополнительными данными об исключениях. Если это не ваш вопрос, не стесняйтесь его игнорировать.

Я думаю, что важный вопрос, который следует задать: для чего именно предназначено сообщение об исключении?Это не для того, чтобы узнать, откуда взялось исключение, для этого нужна трассировка стека;это не инкапсуляция исключения в более общее, это следует делать с помощью поля InnerException;в случае, когда ваше исключение возникает только из определенного места вашего кода, оно даже не для описания того, какая у вас ошибка — для этого нужен тип исключения.

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

Итак, насколько я понимаю ваш вопрос, я думаю, что лучший способ сохранить эту «дополнительную информацию», полученную из другой системы, — это InnerException.Я не знаю Elmah, но если оно того стоит, оно проверит наличие InnerExceptions и сохранит их.

Я не понимаю вопроса: вы расширяете System.Exception и уже добавили поле Elmah.Вот где оно принадлежит — как общедоступное свойство самого исключения.

Elmah — это http-модуль, который записывает необработанные исключения.

Я думаю, это просто ограничение Elmah, поскольку он не хранит настраиваемые поля.Думаю, мне придется спросить у этих ребят.У меня есть дополнительное поле для данных ответа, но Elmah не сохраняет его.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top