Domanda

Ho creato un'eccezione personalizzata per un problema molto specifico che può andare storto.Ricevo dati da un altro sistema e sollevo l'eccezione se bombarda mentre provo ad analizzare quei dati.Nella mia eccezione personalizzata, ho aggiunto un campo chiamato "ResponseData", così posso tenere traccia esattamente di ciò che il mio codice non è riuscito a gestire.

Nelle eccezioni personalizzate come questa, i dati di risposta aggiuntivi dovrebbero entrare nel "messaggio" dell'eccezione?Se andasse lì, il messaggio potrebbe essere enorme.In un certo senso lo voglio lì perché sto usando Elmah, ed è così che posso ottenere quei dati.

Quindi la domanda è:- Come posso convincere Elmah a registrare informazioni extra da un campo in un'eccezione personalizzata o - i dettagli di eccezione extra dovrebbero andare nella proprietà "Messaggio"?

È stato utile?

Soluzione

Non dovresti riempire .Message con informazioni di debug, ma piuttosto con un testo conciso e utile.

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

Il testo del messaggio dovrebbe descrivere completamente l'errore e, quando possibile, spiegare come correggerlo. Il valore della proprietà Message è incluso nelle informazioni restituite da ToString.

La proprietà Message viene impostata solo durante la creazione di un'eccezione.Se non è stato fornito alcun messaggio al costruttore per l'istanza corrente, il sistema fornisce un messaggio predefinito formattato utilizzando le impostazioni cultura del sistema corrente.

[..]

Note per gli eredi:

La proprietà Message viene sottoposta a override nelle classi che richiedono il controllo sul contenuto o sul formato del messaggio.Il codice dell'applicazione in genere accede a questa proprietà quando deve visualizzare informazioni su un'eccezione che è stata rilevata.

Il messaggio di errore dovrebbe essere localizzato.

I dati di risposta non si qualificano come descrizione.

Non avendo familiarità con elmah, non posso dirti come estendere il file Exception classe durante l'utilizzo.Elmah implementa la propria sottoclasse a Exception?O un'interfaccia?Puoi sottoclassarlo tu stesso?

Altri suggerimenti

In eccezioni personalizzate come questa, i dati di risposta extra dovrebbero andare nell'eccezione "messaggio"?

No, come Sören lo ha già sottolineato.Tuttavia, il tipo di eccezione potrebbe sovrascrivere ToString e aggiungere in modo ragionevole le informazioni sui dati di risposta lì.Questa è una pratica perfettamente normale seguita da molti dei tipi di eccezione nella BCL (Base Class Library), quindi non ti ritroverai a nuotare contro corrente.Ad esempio, dai un'occhiata a System.IO.FileNotFoundException.ToString implementazione in SSCLI (rotore):

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;
}

Come puoi vedere, aggiunge il contenuto di FusionLog proprietà, che rappresentano extra informazioni in caso di guasti al carico dell'assieme.

Come posso convincere Elmah a registrare informazioni extra da un campo con un'eccezione personalizzata

ELMAH memorizza il risultato della chiamata ToString su un'eccezione come i dettagli dell'errore, quindi se lo hai ToString implementato come prescritto, le informazioni verrebbero registrate senza ulteriore lavoro.L'unico problema è che i dettagli registrati saranno non strutturato testo.

La classe Exception contiene un dizionario (chiamato Data, credo) che puoi utilizzare per associare dati personalizzati a un'eccezione vanilla.

Non capisco appieno la domanda, ma sembra che tu stia chiedendo cosa fare con dati aggiuntivi sulle eccezioni, se questa non è la tua domanda sentiti libero di ignorarla.

Penso che una domanda importante da porsi sia: a cosa serve esattamente il messaggio di eccezione?Non serve per sapere da dove proviene l'eccezione, l'analisi dello stack serve a quello;non si tratta di incapsulare un'eccezione in un'eccezione più generale, ciò dovrebbe essere fatto con il campo InnerException;nel caso in cui la tua eccezione venga sollevata solo da un punto particolare nel tuo codice, non serve nemmeno per descrivere il tipo di errore che hai avuto: ecco a cosa serve il tipo di eccezione.

Generalmente utilizzo il campo del messaggio per fornire suggerimenti semplici e leggibili che un programmatore che non sono io, vedendo questo errore per la prima volta, può utilizzare per comprendere il sistema sottostante.Considero il campo del messaggio appropriato per una breve spiegazione (una frase), un suggerimento su come viene frequentemente segnalato questo errore o un riferimento a ulteriori letture.

Quindi, per quanto ho capito la tua domanda, penso che il modo migliore per archiviare queste "informazioni aggiuntive" ricevute da un altro sistema sia come InnerException.Non conosco Elmah, ma se ne vale la pena controllerà la presenza di InnerExceptions e le memorizzerà.

Non capisco la domanda: stai estendendo System.Exception e hai già aggiunto il campo Elmah.È lì che appartiene: come proprietà pubblica dell'eccezione stessa.

Elmah è un modulo http che registra le eccezioni non gestite.

Immagino che sia solo una limitazione di Elmah, poiché non memorizza campi personalizzati.Immagino che dovrò chiedere a quei ragazzi.Ho il campo aggiuntivo per i dati di risposta, ma Elmah non lo memorizza.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top