Question

J'ai mis en place une méthode d'emballage autour de signalisation d'erreur de Elmah, où une exception soulevée est seulement vu par Elmah pour l'enregistrement et l'envoi, mais maintenant je voudrais filtrer seulement ces signalaient exceptions de l'envoi, mais encore les connecter . Comment puis-je faire?

Ceci est mon emballage simple:

    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 de plein SignalledExceptions obtenir, et non les véritables exceptions.

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

Était-ce utile?

La solution

Filtrage Elmah fonctionne principalement sur les types d'exception. le filtrage me permettrait Programmatic d'examiner les informations ajoutées à une exception, mais je dois encore rencontré un type d'exception avec une propriété ElmahFilteringData, et je préfère ne pas « envahir » les exceptions que je veux connecté. Voici comment j'accompli seulement envoyer notificatins par email pour certaines exceptions signalées:

D'abord, j'ai une exception enveloppe 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) {}
}

Alors, quand je lève une exception, je ne veux normalement ouvert une session et non envoyé par courrier électronique, mais peut-être parfois envoyé par courriel, j'utiliser ce code dans mon service d'enregistrement 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éballe l'exception de se connecter, et si elle est enveloppée, écartons du pipeline de notification par e-mail:

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();
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top