2009-09-14 2 views
11

Ho un metodo che accetta un nome di file come parametro, tutti i nomi di file dovrebbero terminare con ".csv". Quale eccezione dovrei lanciare se viene passato un nome file che non termina con .csv?Quale eccezione deve essere generata per un nome file non valido?

Oppure devo adottare un approccio diverso?

+0

Cosa succede se un utente ha un file '* .txt' in formato valori separati da virgole? Per un'applicazione arbitraria, il * comportamento previsto * in questo caso sta consentendo una selezione esplicita del file tramite il filtro "Tutti i file" in "FileDialog" o un nome file completo con estensione. –

risposta

14

ArgumentOutOfRangeException - Quello che stai descrivendo è in linea con un'eccezione di gamma.?:

L'eccezione che viene generata quando il valore di un arg ument è al di fuori dell'intervallo consentito di valori definito come dal metodo richiamato.

ArgumentException viene utilizzato per convalidare i caratteri nella stringa di percorso non il tipo di file.

Il parametro path è un stringa di lunghezza zero, contiene solo spazi vuoti, o contiene uno o più validi caratteri.

IMHO la tabella di caduta-through convalida del percorso è simile al seguente:

Se questo non è abbastanza descrittivo per voi quindi creare la propria classe eccezione :

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, come concordato con la documentazione di 'ArgumentException'," Le classi derivate primarie di 'ArgumentException' sono' ArgumentNullException' e 'ArgumentOutOfRangeException'. Queste classi derivate dovrebbero essere utilizzate al posto di' ArgumentException', tranne in situazioni in cui nessuno dei due delle classi derivate è accettabile. " –

10

ArgumentException corrisponde alla fattura IMO.

8

probabilmente sarei uso ArgumentException, in quanto è "L'eccezione che viene generata quando uno degli argomenti forniti a un metodo non è valido"

1

System.ArgumentException appare opportuno, direttamente o come classe base per la vostra eccezione .

5

Controllare la documentazione di un metodo IO esistente nel Framework. Descrive le eccezioni generate da un metodo. Ad esempio, controlla StreamWriter.StreamWriter(String, Boolean, Encoding, Int32) Constructor allo http://msdn.microsoft.com/en-us/library/0wf7ab94(VS.85).aspx. L'eccezione che ti suggerisco di utilizzare, per rimanere coerente, è IOException. È quindi possibile aggiungere un messaggio personalizzato che descrive i particolari.

IOException - percorso include una sintassi errata o non valida per il nome del file, il nome della directory o la sintassi dell'etichetta del volume.

Nel tuo caso, l'estensione del file non è corretta, quindi informa l'utente, come in Throw New IOException("Invalid file extension.").

Vorrei lasciare ArgumentException come descritto nella documentazione, il percorso è una stringa vuota (""). "

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

+0

Questo è un buon punto. Non sono molto contento di come il framework gestisce questo, ma se vuoi essere coerente con le classi Stream, potrebbe essere una buona idea farlo (supponendo che il metodo in questione sia in realtà correlato all'IO) –

+0

concordato, ma dopo Mi sono abituato alle eccezioni IO, non mi dispiace troppo. Un vantaggio di lasciare ArgumentException come definito consentirebbe un facile debugging quando il nome del file è veramente "". – AMissico

+1

No, un'estensione errata (ma valida) non è un'esclusione IOExc. È un vincolo rotto a questo livello. –

1

ne dite basta creare il proprio InvalidFilenameException Per esempio:

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

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

Più codice scrivi, più possibilità di bug, più tempo ci vuole, più decisioni devono essere prese. A meno che non vi sia un'esigenza specifica per un'eccezione personalizzata, è meglio evitarli. – AMissico

+0

Beh, certo. Ma se trovo più chiaro creare la tua Eccezione se non riesci a trovare qualcuno che si adatti davvero. Come la IOException suggerita. È davvero un IOException? Probabilmente userò ArgumentException, suggerito da altri qui. Ma ho pensato di poter portare un'alternativa. – Svish

+0

Vero. Henk Holterman è un buon punto. È piuttosto difficile fare un suggerimento perché la domanda è vaga. Ecco perché cerco di convincere lo sviluppatore a consultare la documentazione esistente come guida. – AMissico