2009-03-11 4 views
1

Wenn ich eine Funktion in einem Utility-Modul schreibe, um sie wieder zu verwenden, lasse ich viele Kommentare am Anfang von Funktionen und einige einfache Eingabeprüfungen, um eine Nachricht im Debugger zu erzeugen, wenn eine Funktion unangemessen verwendet wird. ohne einen throw-Befehl zu verwenden.Wie können Sie Ausnahmen während der Laufzeit Ihres Codes am besten behandeln?

Was ist die beste Methode für den Umgang mit solchen Situationen? Welche Funktionalität ist hierfür in C# am einfachsten?

In meinen CS-Klassen vor einem Jahrzehnt würden wir einfach einen Befehl assert (...) in C++ verwenden und das Programm bombardieren lassen, wenn etwas falsch verwendet wurde.

Jetzt, da ich C# verwende, habe ich zwei Methoden verwendet, eine MessageBox.Show ("...") zu werfen, um zu erklären, warum eine Funktion vorzeitig zurückkehrt oder eine Console.WriteLine ("...") um es nur in der Debug-Konsole zu erklären.

Ich bin derzeit in Richtung auf das Schreiben einer benutzerdefinierten ErrorMessage-Funktion, die den Build-Typ und möglicherweise ein #define Master-Toggle überprüfen würde vor der Anzeige irgendetwas und wahrscheinlich speichern in einer .log-Datei, wenn ich in einer Beta-Umgebung bin.

Was ist die beste Methode in solchen Utility-Modulen zu verwenden?

+0

Können Sie erweitern auf, warum Sie sich entschieden haben nicht Ausnahmen in diesen Szenarien zu benutzen? –

+0

Ich kannte meistens nicht die richtige Syntax in C#. Ich lerne dazu, eine Sprache vom Editor zu lernen, und ich habe mir die Methoden der Debug-Klasse nicht angesehen. – Fred

Antwort

5

Wenn die Methode mit ungültigen Argumenten aufgerufen wird, sollte sie eine ArgumentException oder eine davon abgeleitete Ausnahme auslösen. Wenn die Methode aufgerufen wird, die aufgrund des Status des Objekts derzeit nicht aufgerufen werden kann, sollte sie eine InvalidOperationException auslösen.

Andere Leute, die Ihre Bibliothek anrufen, werden Ihnen nicht dafür danken, dass Sie Dinge in einer nicht standardmäßigen oder nicht naheliegenden Weise getan haben. Wie zum Beispiel das Anzeigen von Nachrichtenfeldern. Vor allem, wenn sie Ihre Bibliothek über eine Website oder einen Windows-Dienst aufrufen, der keine Benutzeroberfläche anzeigen kann. Und die Ausgabe an das Debug-Fenster ist viel zu wahrscheinlich, um verpasst zu werden.

4

Eine Ausnahme auslösen. Es ist die klarste Art zu zeigen, dass etwas nicht stimmt, und es ist viel schwieriger zu ignorieren als eine Konsolen-Nachricht oder sogar eine Nachrichtenbox.

Insbesondere bedeutet es, dass der Code-Pfad wird nicht weitermachen, vorausgesetzt, dass alles in Ordnung ist. Selbst wenn der Benutzer (ob in der Betaversion oder nicht) die Nachrichtenbox bemerkt, wird er nicht glücklich darüber sein, dass, sobald er auf "OK" klickt, die Anwendung losgeht und ihre Daten nur wegen des Dienstprogramms löscht Methode wurde nicht richtig verwendet.

+0

Wenn Sie die Zeit haben, würden Sie die Syntax erklären, um eine eindeutige Fehlermeldung in C# zu geben, wenn eine Ausnahme ausgelöst wird? – Fred

+0

An wen soll die Fehlermeldung gehen? Wenn es für den Benutzer ist, liegt das an dem aufrufenden Code - normalerweise würde ich die Ausnahme in den Stapel blubbern lassen, wahrscheinlich in die Nähe des oberen Bereichs, und dann eine geeignete Fehlermeldung anzeigen, die erklärt, dass ihr Vorgang nicht abgeschlossen werden konnte. –

+0

Die generelle Frage, herauszufinden, was man den Nutzern sagen soll, ist sicherlich sehr schwierig. Wenn es ein Validierungsfehler ist (d. H. Der Benutzer hat versagt), ist das einfach - aber wenn es aufgrund eines Fehlers oder externer Bedingungen ist, ist es viel schwieriger, richtig zu machen. Ich denke, das ist eine ganz andere Frage. –

1

Ich stimme Jon Antwort, aber Sie haben auch Debug.Assert als Teil Ihres Toolkits. Manchmal kann dies Ihnen besser helfen, wenn Sie Entwickler vor etwas warnen wollen, aber möchten, dass es im Produktionscode durchläuft.

1

Ich mag pipTheGeek Antwort, aber ich dachte, dass ich in einem Stecker für eine MSR-Technik werfen würde, die für C# 4.0 in der Pipeline sein kann: Code Contracts

Die offensichtliche Antwort ist die Standard-Ausnahmen zu verwenden, die kommen verpackt B. in den Basisklassenbibliotheken von .Net (ArgumentNullException, InvalidOperationException, NotImplementedException usw.), oder erfinden Sie Ihre eigene spezifische Ausnahme, wenn Sie der Ansicht sind, dass ein Benutzer Ihrer Klasse möglicherweise etwas mehr Details darüber benötigt, warum er eine Ausnahme empfängt.

Wenn Ihr Code später verwendet wird, müssen Sie die möglichen Ausnahmen im Abschnitt Xml-Kommentare auflisten.

Stapelinformationen werden in Ihrem Auftrag von der CLR ausgefüllt, Sie müssen also nur diesen Bad Boy werfen und den Verbraucher mit den Konsequenzen befassen.

Da Sie über die Syntax gefragt:

/// <summary> 
    /// Summary: 
    ///  Does stuff. 
    /// Exceptions: 
    ///  ArgumentNullException: 
    ///  args must be non-null 
    /// </summary> 
    /// <param name="args"></param> 
    public static void DoStuff(string[] args) 
    { 
     if(args == null) 
     throw new ArgumentNullException("args", "'args' parameter cannot be null."); 

     ... 
    } 
+0

Ihr Link scheint atm gebrochen zu sein. – Fred

+0

Aber die Info vor allem der Codeblock war sehr hilfreich. Ich habe oft zusammenfassende Blöcke verwendet, die mir besonders gefallen, indem ich mir einen Punkt gegeben habe, um die Argumente zu erklären, besonders wenn ich Überladung benutze. – Fred

+0

Es gibt eine Ausnahmeempfehlung für XML-Code-Kommentare: http://msdn.microsoft.com/en-us/library/w1htk11d.aspx# –

Verwandte Themen