2010-08-04 4 views
1

J'ai implémenté une méthode wrapper autour de la signalisation d'erreur d'Elmah, où une exception levée est seulement vue par Elmah pour la journalisation et l'envoi, mais maintenant je voudrais filtrer seulement ces exceptions signalées de l'envoi, mais toujours les enregistrer. Comment puis-je faire ceci?Filtrage des exceptions signalées par des messages d'erreur Elmah

Ceci est mon simple, emballage:

public void LogException(Exception exception) 
    { 
     ErrorSignal.FromContext(HttpContext.Current).Raise(exception); 
    } 

J'ai pensé à envelopper l'exception d'entrée dans un SignalledException personnalisé, et filtrer ceux de diffusion, mais mes journaux obtenir plein de SignalledExceptions, et non la vraies exceptions.

D'autres idées s'il vous plaît?

Répondre

3

Le filtrage Elmah fonctionne principalement sur les types d'exception. Le filtrage programmatique me permettrait d'examiner les informations ajoutées à une exception, mais je n'ai pas encore trouvé de type Exception avec une propriété ElmahFilteringData, et je préfère ne pas "envahir" les exceptions que je veux enregistrer. Voici comment j'accompli que l'envoi d'email notificatins pour certaines signalisés exceptions:

Tout d'abord j'ai une exception emballage spéciale, uniquement pour dire Elmah de ne pas envoyer une notification par e-mail pour les exceptions de ce type:

public class ElmahEMailBlockWrapperException: Exception 
{ 
    public const string Explanation = "This is a wrapper exception that will be blocked by Elmah email filtering. The real exception is the InnerException"; 
    public ElmahEMailBlockWrapperException(Exception wrappedException):base(Explanation, wrappedException) {} 
} 

Ensuite, , quand je lève une exception normalement, je ne veux connecté et non envoyé par courrier électronique, mais peut-être parfois envoyé par courriel, j'utiliser ce code dans mon service de journalisation d'exception:

public void LogException(Exception exception, bool includeEmail) 
{    
    if (includeEmail) 
    { 
     ErrorSignal.FromContext(HttpContext.Current).Raise(exception); 
    } 
    else 
    { 
     // Wrap the input exception in a special exception type that the Elmah email filter can block. 
     var wrappedException = new ElmahEMailBlockWrapperException(exception); 
     ErrorSignal.FromContext(HttpContext.Current).Raise(wrappedException); 
    } 
} 

maintenant, dans les événements de filtre Elmah dans Global.asax, je déballer l'exception sur le journal, et s'il est enveloppé, le rejeter à partir du pipeline de notification par courrier électronique:

public void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs e) 
{ 
    // If the exception was wrapped in a ElmahEMailBlockWrapperException exception to be blocked by the ErrorMail filter, the InnerException 
    // of the the ElmahEMailBlockWrapperException is the real exception to be logged, so we extract it, log it, and dismiss the wrapper. 
    var ebw = e.Exception.GetBaseException() as ElmahEMailBlockWrapperException; 
    if (ebw != null) 
    { 
     ErrorLog.GetDefault(HttpContext.Current).Log(new Error(ebw.InnerException)); 
     e.Dismiss(); 
    } 
} 

public void ErrorMail_Filtering(object sender, ExceptionFilterEventArgs e) 
{ 
    // If the exception was wrapped, i.e. raised only to be logged by Elmah and not emailed, dismiss it. 
    if (e.Exception.GetBaseException() is ElmahEMailBlockWrapperException) 
    { 
     e.Dismiss(); 
    } 
} 
Questions connexes