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

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

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

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

Ответ 1

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

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

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

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

[..]

Примечания для наследующих:

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

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

Данные ответа не относятся к описанию.

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

Ответ 2

В пользовательских исключениях, таких как этот, следует добавить дополнительные данные ответа в исключение "сообщение"?

Нет, поскольку Сорен уже указал. Однако ваш тип исключения может переопределить ToString и разумно добавить туда информацию об ответах. Это совершенно нормальная практика, за которой следуют многие из типов исключений в BCL (Base Class Library), поэтому вы не сможете запятнать себя. Например, рассмотрите 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, которое представляет дополнительную информацию в случае сбоев загрузки сборок.

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

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

Ответ 3

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

Ответ 4

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

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

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

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

Ответ 5

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

Ответ 6

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

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