Я бы порекомендовал обернуть вызов в Elmah в свой собственный простой класс-оболочку.
using Elmah;
public static class ErrorLog
{
/// <summary>
/// Log error to Elmah
/// </summary>
public static void LogError(Exception ex, string contextualMessage=null)
{
try
{
// log error to Elmah
if (contextualMessage != null)
{
// log exception with contextual information that's visible when
// clicking on the error in the Elmah log
var annotatedException = new Exception(contextualMessage, ex);
ErrorSignal.FromCurrentContext().Raise(annotatedException, HttpContext.Current);
}
else
{
ErrorSignal.FromCurrentContext().Raise(ex, HttpContext.Current);
}
// send errors to ErrorWS (my own legacy service)
// using (ErrorWSSoapClient client = new ErrorWSSoapClient())
// {
// client.LogErrors(...);
// }
}
catch (Exception)
{
// uh oh! just keep going
}
}
}
Затем просто вызывайте его всякий раз, когда вам нужно зарегистрировать ошибку.
try {
...
}
catch (Exception ex)
{
// log this and continue
ErrorLog.LogError(ex, "Error sending email for order " + orderID);
}
Это имеет следующие преимущества:
- Вам не нужно помнить этот слегка архаичный синтаксис вызова Elmah
- Если у вас много DLL, вам не нужно ссылаться на ElmahЯдро каждого из них - и просто поместите это в свою собственную «Системную» DLL.
- Если вам когда-нибудь понадобится выполнить какую-либо специальную обработку или просто захотите поставить точку останова для отладки ошибок, у вас все это в одном месте.
- Если вы когда-нибудь отойдете от Elmah, вы можете просто поменять одно место.
- Если у вас есть устаревшая регистрация ошибок, которую вы хотите сохранить (у меня просто получился простой механизм регистрации ошибок, который связанв некоторые пользовательские интерфейсы, которые я не могу сразу удалить).
Примечание: я добавил свойство contextualMessage для контекстной информации.Вы можете пропустить это, если хотите, но я считаю это очень полезным.Elmah автоматически разворачивает исключения, поэтому базовое исключение все равно будет отображаться в журнале, но contextualMessage будет отображаться при нажатии на него.