2009-09-14 12 views
11

Ich habe eine Methode, die einen Dateinamen als Parameter akzeptiert, alle Dateinamen sollten mit '.csv' enden. Welche Ausnahme sollte ich auslösen, wenn ein Dateiname übergeben wird, der nicht mit .csv endet?Welche Ausnahme sollte für einen ungültigen Dateinamen ausgelöst werden?

Oder sollte ich einen anderen Ansatz wählen?

+0

Was passiert, wenn ein Benutzer eine '* .txt' Datei im kommagetrennten Werteformat hat? Für eine beliebige Anwendung erlaubt das * erwartete Verhalten * in diesem Fall eine explizite Auswahl der Datei über den Filter "Alle Dateien" im "FileDialog" oder eine vollständige Dateinameneingabe mit der Erweiterung. –

Antwort

14

ArgumentOutOfRangeException - Was Sie beschreiben, mit einem außerhalb der Reichweite Ausnahme entspricht.?:

die Ausnahme, die ausgelöst wird, wenn der Wert eines Arg- ement ist außerhalb des zulässigen Wertebereichs, wie er durch die aufgerufene Methode definiert ist.

ArgumentException wird verwendet, um die Zeichen in der Pfadzeichenfolge nicht der Dateityp zu validieren.

Der Pfad Parameter ist eine Null-Länge Zeichenfolge enthält nur Leerraum oder enthält ein oder mehrere ungültige Zeichen.

IMHO die Pfadüberprüfung Durchfalldiagramm wie folgt aussieht:

Wenn das nicht beschreibend ist genug für Sie dann Ihre eigene Exception-Klasse erstellen :

public class InvalidFileTypeException : System.IO.IOException 
{ 
    public InvalidFileTypeException(string path, string acceptedTypeMask) 
    { 
     this.Message = string.Format(
      "File type '{0}' does not fall within the expected range: '{1}'", 
      path, 
      acceptedTypeMask); 
    } 
} 

...

throw new InvalidFileTypeException("foo.txt", "*.csv"); 
+0

+1, vereinbart - wie die Dokumentation zu 'ArgumentException' besagt:" Die primären abgeleiteten Klassen von 'ArgumentException' sind' ArgumentNullException' und 'ArgumentOutOfRangeException'. Diese abgeleiteten Klassen sollten anstelle von' ArgumentException' verwendet werden, außer in Situationen, in denen keine der abgeleiteten Klassen ist akzeptabel. " –

10

ArgumentException würde die Rechnung IMO passen.

8

ich wahrscheinlich ArgumentException verwenden würde, wie es ist „Die Ausnahme, die ausgelöst wird, wenn eines des Arguments, ein Verfahren zur Verfügung gestellt nicht gültig ist“

1

System.ArgumentException angemessen erscheint, entweder direkt oder als Basisklasse für die Ausnahme .

5

Überprüfen Sie die Dokumentation einer vorhandenen IO-Methode im Framework. Es beschreibt die Ausnahmen, die von einer Methode generiert werden. Überprüfen Sie beispielsweise StreamWriter.StreamWriter(String, Boolean, Encoding, Int32) Constructor unter http://msdn.microsoft.com/en-us/library/0wf7ab94(VS.85).aspx. Die Ausnahme, die Sie vorschlagen, um konsistent zu bleiben, ist IOException. Sie können dann eine benutzerdefinierte Nachricht hinzufügen, die die Einzelheiten beschreibt.

IOException - Der Pfad enthält eine falsche oder ungültige Syntax für den Dateinamen, den Verzeichnisnamen oder die Laufwerkslabelsyntax.

In Ihrem Fall ist die Dateierweiterung falsch, also sagen Sie dem Benutzer, wie in Throw New IOException("Invalid file extension.").

Ich würde verlassen ArgumentException wie in der Dokumentation beschrieben, Pfad ist eine leere Zeichenfolge (""). "

Choosing the Right Type of Exception to Throw bei http://msdn.microsoft.com/en-us/library/ms229021.aspx Siehe

+0

Das ist ein guter Punkt. Ich bin nicht sehr glücklich darüber, wie das Framework dies behandelt, aber wenn Sie mit den Stream-Klassen konsistent sein wollen, ist es vielleicht eine gute Idee, dies zu tun (vorausgesetzt, die betreffende Methode ist tatsächlich mit IO verbunden) –

+0

Einverstanden, aber danach Ich habe mich an die IO-Ausnahmen gewöhnt, es stört mich nicht allzu sehr. Ein Vorteil, ArgumentException wie definiert zu lassen, würde ein einfaches Debuggen ermöglichen, wenn der Dateiname wirklich "" ist. – AMissico

+1

Nein, eine falsche (aber gültige) Erweiterung ist keine IOException. Es ist eine gebrochene Einschränkung auf dieser Ebene. –

1

Wie wäre es nur Ihre eigenen InvalidFilenameException Zum Beispiel erstellen:

public class InvalidFilenameException : Exception 
{ 
    public string Filename { get; private set; } 

    public InvalidFilenameException(string message, string invalidFilename) 
     :base(message) 
    { 
     Filename = invalidFilename; 
    } 
} 
+1

Je mehr Code Sie schreiben, desto größer ist das Potenzial für Fehler. Je mehr Zeit benötigt wird, desto mehr Entscheidungen müssen getroffen werden. Wenn keine benutzerdefinierte Ausnahme erforderlich ist, sollten sie besser vermieden werden. – AMissico

+0

Nun, natürlich. Aber wenn ich es klarer finde, deine eigene Exception zu erstellen, wenn du wirklich niemanden findest, der wirklich passt. Wie die vorgeschlagene IOException. Ist es wirklich eine IOException? Ich würde wahrscheinlich ArgumentException verwenden, vorgeschlagen von anderen hier. Aber ich dachte nur, ich könnte eine Alternative bringen. – Svish

+0

Wahr. Henk Holterman macht einen guten Punkt. Es ist schwer, einen Vorschlag zu machen, weil die Frage vage ist. Aus diesem Grund versuche ich, den Entwickler dazu zu bringen, sich die vorhandene Dokumentation anzusehen. – AMissico

Verwandte Themen