2008-09-28 8 views
34

Wie haben Sie die Exception.Data-Eigenschaft in C# -Projekten verwendet, an denen Sie gearbeitet haben?Verwenden von Exception.Data

Ich möchte Antworten, die ein Muster vorschlagen, anstatt diejenigen, die sehr spezifisch für Ihre App sind.

Antwort

17

Der von mir verwendete Ausnahmeprotokollierer wurde optimiert, um alle Elemente in der Datensammlung auszugeben. Dann können wir für jede Ausnahme, die wir nicht vom Exception-Stack diagnostizieren können, alle Daten im Funktionsumfang dieser Funktion hinzufügen, einen neuen Build senden und darauf warten, dass es erneut auftritt.

Ich denke, wir sind Optimisten darin, dass wir es nicht in jede Funktion schreiben, aber wir sind Pessimisten darin, dass wir es nicht herausnehmen, sobald wir das Problem behoben haben.

14

Ich habe es verwendet, als ich wusste, dass die Ausnahme, die ich erstellte, serialisiert werden musste. Als ich eines Tages Reflector benutzte, entdeckte ich, dass Excepion.Data in Serialisierungs-Streams gesteckt und aus ihnen gezogen wurde. Wenn ich also Eigenschaften für eine benutzerdefinierte Ausnahmeklasse habe, die bereits serialisierbare Typen sind, implementiere ich sie für die abgeleitete Klasse und verwende das zugrunde liegende Datenobjekt als Speichermechanismus, anstatt private Felder zu erstellen, in denen die Daten gespeichert werden können. Wenn die Eigenschaften meines benutzerdefinierten Ausnahmeobjekts eine erweiterte Serialisierung erfordern, implementiere ich sie im Allgemeinen unter Verwendung von privaten Unterschriftsfeldern und verarbeite ihre Serialisierung in der abgeleiteten Klasse.

Bottom line, Exception.Data gibt Ihnen Serialisierung kostenlos, nur indem Sie Ihre Eigenschaften in sie - aber nur daran erinnern, dass diese Elemente serialisierbar sein müssen!

+6

Das einzige Problem bei diesem Ansatz ist, dass Data-Eigenschaft als virtuelle definiert ist, was bedeutet, Sie sollten es nicht die Konstrukteure in Ausnahme verwenden (berichtet von FxCop).Das ist ein Problem, wenn Sie möchten, dass ein Konstruktor Ihre benutzerdefinierten Eigenschaften mit dem Datenwörterbuch verknüpft. –

+0

Ein gültiger Punkt; Es kann jedoch auf zwei Arten abgeschwächt werden: 1. Stellen Sie keinen Konstruktor zum Festlegen dieser Eigenschaften bereit (und führen Sie stattdessen den virtuellen Aufruf aus). Stellen Sie stattdessen nur get/set-Eigenschaftenaccessoren bereit und verwenden Sie die Initialisierersyntax für Objekte. 2. Markieren Sie Ihre Ausnahmeklasse als versiegelt. Während "versiegelt" im Allgemeinen mich in die falsche Richtung reibt, kann es in vielen Fällen, in denen eine benutzerdefinierte Ausnahmeklasse betroffen ist, durchaus legitim sein. –

+1

Oder einfach nicht, das Aufrufen virtueller Methoden von Konstruktoren bringt Sie nur in ungewöhnlichen Randfällen in Schwierigkeiten –

9

Ich habe es verwendet, um Informationen über den Zustand zum Zeitpunkt der Ausnahme aus dem umschließenden Bereich zu erfassen, während die Ausnahme den Stapel hochfährt. Elemente wie der Dateiname, der die Ausnahmebedingung verursacht hat, oder der Wert einer ID, mit der das Problem leichter aufgespürt werden kann. Ich neige dazu, auch wie die RawUrl, die Cookies, die Referrer, ... ist

hier my blog on the topic

Auf der obersten Ebene in einer Web-Anwendung Weitere Informationen viel von der Anfrage Informationen hinzufügen:

Anstatt auf das Auftreten von Problemen zu warten, füge ich diesen Code immer dort ein, wo eine Ausnahme auftreten kann, die sich auf etwas Externes bezieht, z ein Dateiname oder eine URL, auf die zugegriffen wurde ... Mit anderen Worten, alle Daten, die das Problem reproduzieren.

8

Da keine der Antworten Code enthalten. Etwas, das als Ergänzung zu dieser Frage nützlich sein könnte, ist, wie man das .Data Wörterbuch tatsächlich betrachtet. Da es kein generisches Wörterbuch ist und nur IDictionary

foreach(var kvp in exception.Data) zurückgibt, wird die Art von KVP tatsächlich object nicht hilfreich sein. Doch von den MSDN gibt es eine einfache Möglichkeit, dieses Wörterbuch iterieren:

foreach (DictionaryEntry de in e.Data) 
    Console.WriteLine(" Key: {0,-20}  Value: {1}", 
          "'" + de.Key.ToString() + "'", de.Value); 

Ich weiß nicht wirklich, was das Format Argument , -20 bedeuten würde, vielleicht nehmen (20)? Digressing ... dieser Code kann in einem allgemeinen Fehlerlogger sehr hilfreich sein, um diese Daten aufzuheben. Eine vollständigere Nutzung würde ähnlich sein:

var messageBuilder = new StringBuilder(); 

do 
{     
    foreach (DictionaryEntry kvp in exception.Data) 
     messageBuilder.AppendFormat("{0} : {1}\n", kvp.Key, kvp.Value); 

    messageBuilder.AppendLine(exception.Message); 


} while ((exception = exception.InnerException) != null); 

return messageBuilder.ToString();