2008-09-07 3 views
11

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

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

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

ответ

6

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

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

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

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

[..]

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

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

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

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

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

0

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

1

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

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

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

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

0

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

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

11

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

Нет, as Sören already pointed out. Однако ваш тип исключения может переопределить ToString и разумно добавить туда информацию об ответах. Это совершенно нормальная практика, за которой следуют многие из типов исключений в BCL (Base Class Library), поэтому вы не сможете запятнать себя. Например, посмотрите на System.IO.FileNotFoundException.ToString реализации в SSCLI (Rotor):

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 в соответствии с предписаниями, информация будет регистрироваться без дальнейшей работы. Единственная проблема заключается в том, что зарегистрированная деталь будет неструктурированной текст.

4

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

+0

http://msdn.microsoft.com/en-us/library/system.exception.data(v=vs.110).aspx – 2014-02-06 03:47:25