2008-09-07 9 views
11

Ich habe eine benutzerdefinierte Ausnahme für ein sehr spezifisches Problem erstellt, das schief gehen kann. Ich erhalte Daten von einem anderen System, und ich erhebe die Ausnahme, wenn es beim Versuch, diese Daten zu analysieren, bombardiert. In meiner benutzerdefinierten Ausnahme habe ich ein Feld namens "ResponseData" hinzugefügt, damit ich genau verfolgen kann, was mein Code nicht verarbeiten kann.Hinzufügen von zusätzlichen Informationen zu einer benutzerdefinierten Ausnahme

In benutzerdefinierten Ausnahmen wie dieser, sollten diese zusätzlichen Antwortdaten in die Ausnahme "Nachricht" gehen? Wenn es dort ankommt, könnte die Nachricht sehr groß sein. Ich möchte es dort haben, weil ich Elmah benutze, und so kann ich an diese Daten kommen.

Die Frage ist also entweder: - Wie kann ich Elmah zusätzliche Informationen aus einem Feld in einer benutzerdefinierten Ausnahme OR aufzunehmen - Sollten zusätzliche Ausnahme Details gehen in die „Botschaft“ Eigentum?

Antwort

6

Sie sollten .Message nicht mit Debug-Informationen füllen, sondern mit einem prägnanten, hilfreichen Stück Text.

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

Der Text der Nachricht der Fehler vollständig beschreiben sollte und, wenn möglich, erklären, wie es zu korrigieren. Der Wert der Message-Eigenschaft ist in den von ToString zurückgegebenen Informationen enthalten.

Die Message-Eigenschaft wird nur beim Erstellen einer Ausnahme festgelegt. Wenn dem Konstruktor für die aktuelle Instanz keine Nachricht übergeben wurde, wird vom System eine Standardnachricht bereitgestellt, die mit der aktuellen Systemkultur formatiert wird.

[..]

Hinweise zur Vererbung:

Die Message-Eigenschaft wird in Klassen überschrieben, die die Kontrolle über den Nachrichteninhalt oder Format erfordern. Anwendungscode greift normalerweise auf diese Eigenschaft zu, wenn Informationen zu einer abgefangenen Ausnahme angezeigt werden müssen.

Die Fehlermeldung sollte lokalisiert werden.

Antwortdaten sind nicht als Beschreibung zu qualifizieren.

Nicht vertraut mit Elmah, kann ich Ihnen nicht sagen, wie Sie die Klasse Exception während der Verwendung erweitern. Implementiert elmah eine eigene Unterklasse zu Exception? Oder eine Schnittstelle? Kannst du es selbst unterklassieren?

0

Ich verstehe die Frage nicht - Sie erweitern System.Exception, und Sie bereits das Elmah-Feld hinzugefügt. Da gehört es - als öffentliches Eigentum der Ausnahme selbst.

1

Ich verstehe die Frage nicht vollständig, aber Sie scheinen zu fragen, was mit zusätzlichen Ausnahmedaten zu tun ist, wenn das nicht Ihre Frage ist, fühlen Sie sich frei, dies zu ignorieren.

Ich denke, eine wichtige Frage zu fragen ist, was genau ist die Ausnahme Nachricht für? Es ist nicht für das Wissen, wo die Ausnahme kam, die Stack-Trace ist dafür; Es ist nicht eine Ausnahme in eine allgemeinere einzukapseln, die mit dem InnerException-Feld gemacht werden sollte; In dem Fall, in dem Ihre Ausnahme nur von einer bestimmten Stelle in Ihrem Code ausgelöst wird, dient sie nicht einmal dazu, zu beschreiben, welche Art von Fehler Sie hatten - das ist der Typ der Ausnahme.

Im Allgemeinen benutze ich das Nachrichtenfeld, um einfache, menschenlesbare Tipps zu geben, dass ein Programmierer, der nicht ich ist, diesen Fehler zum ersten Mal sehen kann, um das zugrundeliegende System zu verstehen. Ich betrachte das Nachrichtenfeld als angemessen für eine kurze Erklärung (einen Satz), einen Hinweis, wie dieser Fehler häufig auftritt, oder einen Verweis auf weiteres Lesen.

Also, soweit ich Ihre Frage verstehe, denke ich, dass der beste Weg, diese "zusätzliche Information" zu speichern, die von einem anderen System empfangen wird, ist eine InnerException. Ich kenne Elmah nicht, aber wenn es sich lohnt, wird es nach InnerExceptions suchen und sie speichern.

0

Elmah ist ein HTTP-Modul, das nicht behandelte Ausnahmen aufzeichnet.

Ich denke, es ist nur eine Einschränkung von Elmah, da es keine benutzerdefinierten Felder speichert. Ich denke, ich muss diese Leute fragen. Ich habe das extra Feld für die Antwortdaten, aber Elmah speichert es nicht.

11

In benutzerdefinierten Ausnahmen wie diese, sollte , dass zusätzliche Antwortdaten gehen in die Ausnahme „message“?

Nein, wie Sören already pointed out. Ihr Ausnahmetyp könnte jedoch ToString überschreiben und die Antwortdaten dort sinnvoll hinzufügen. Dies ist eine ganz normale Vorgehensweise, der viele der Ausnahmetypen in der BCL (Basisklassenbibliothek) folgen, so dass Sie nicht gegen die Flut schwimmen. Zum Beispiel haben einen Blick auf die System.IO.FileNotFoundException.ToString Implementierung in SSCLI (Rotor):

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

Wie Sie sehen können, es hängt den Inhalt der FusionLog Eigenschaft, die zusätzliche Informationen bei Montage Ladefehler darstellen.

Wie kann ich Elmah zusätzliche Informationen aus einem Feld

in einem benutzerdefinierten Ausnahme

ELMAH speichern das das Ergebnis aufzuzeichnen ToString auf einer Ausnahme, da die Details des Fehlers Aufruf so, wenn Sie ToString implementiert wie vorgeschrieben, würde die Information ohne weitere Arbeit protokolliert werden. Das einzige Problem ist, dass das protokollierte Detail unstrukturiert Text ist.

4

Die Exception-Klasse enthält ein Wörterbuch (mit dem Namen Daten, glaube ich), die Sie verwenden können, um benutzerdefinierte Daten mit einer Vanilla-Ausnahme zu verknüpfen.

+0

http://msdn.microsoft.com/en-us/library/system.exception.data(v=vs.110).aspx –

+0

Denken Sie daran, wenn eine Ausnahme serialisiert ist, muss auch alles darin serialisierbar sein - Es ist also gut, nur das herauszuholen, was du brauchst, wenn dein Objekt kompliziert ist –