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