Hier ist mein Code:
public void ReadSomeFile(string filePath)
{
if (!File.Exists(filePath))
throw new FileNotFoundException();
var stream = new FileStream(filePath, ....)
.....
}
Soll ich selbst eine Ausnahme auslösen (siehe File.Exists
Scheck)? FileStream
wird bereits werfen, FileNotFoundException
wenn die Datei nicht existiert. Was ist hier gute Programmierpraxis? Die Code-Analyse besagt, dass wir unsere Parameter validieren sollten. Aber wenn ich diesen Parameter direkt an eine andere Methode (meinen oder einen anderen Code) übergebe und diese Methode selbst eine Ausnahme auslöst, was ist dann der Vorteil der Validierung von Argumenten in meinem Code?
FileNotFoundException
- tatsächlich lädt es nur zu Problemen mit den Rennbedingungen ein. Entweder Sie behandeln die Ausnahme, lassen sie weitergeben oder schließen sie in Ihre eigene Ausnahme ein. Dies entspricht "Ich weiß, was ich damit machen soll", "Ich weiß nicht, was ich damit machen soll" bzw. "Ich möchte das höher auf dem Stapel behandeln".filePath
gültig aussehen (dh absoluter Pfad oder zumindest nicht enthaltenPath.GetInvalidFileNameChars()
)Antworten:
if (File.Exists(f)) { DoSomething(f) }
(oder die Negation davon) ist ein Anti-Muster. Die Datei kann zwischen diesen beiden Anweisungen gelöscht oder erstellt werden, daher ist es wenig sinnvoll, ihre Existenz so zu überprüfen.Abgesehen davon kann, wie in den Kommentaren ausgeführt,
File.Exists()
das tatsächliche Öffnen der Datei aus verschiedenen Gründen immer noch fehlschlagen , obwohl dies möglicherweise true zurückgibt. Sie müssen also die Fehlerprüfung wiederholen und das Öffnen der Datei umgehen.Da Sie sich nicht wiederholen möchten, sondern Ihren Code trocken halten möchten, versuchen Sie einfach, die Datei zu öffnen und
new FileStream()
werfen zu lassen . Dann können Sie die Ausnahme abfangen und, wenn Sie möchten, das Original erneut auslösen oder eine anwendungsspezifische Ausnahme auslösen.Natürlich
File.Exists()
kann ein Anruf gerechtfertigt sein, aber nicht in diesem Muster.quelle
File.Open(f);
Werfen und dem Abfangen erstellen . Das Problem ist weniger, dass sich die Situation ändern könnte, bevor Sie damit umgehen (da dies im Fehlerfall nahezu unvermeidbar ist), sondern dass Sie die Fehlerprüfung einmal durchführen sollten, um Wiederholungen zu vermeiden (und Sie müssen die Fehlerprüfung trotzdem beim Öffnen durchführen). (Beachten Sie auch, dass ein erfolgreiches Öffnen bei Gesprächen mit einigen Dateisystemen nicht bedeutet, dass die Datei nicht auf Ihnen gelöscht wird. Selbst dort kann der Fehler auftreten, nachdem das Öffnen zu funktionieren scheint.)Ihre Methode wird aufgerufen
ReadSomeFile
und nimmt afilename
als Eingabe, daher ist es sinnvoll, a zu werfenFileNotFoundException
. Da Sie keinen Wert hinzufügen können, indem Sie die Ausnahme abfangen und dann selbst auslösen, lassen Sie .NET sie einfach auslösen.Wenn Ihre Methode jedoch
LoadData(databaseName)
auf viele Dateien zugreifen muss, kann das Abfangen der Ausnahme und das Auslösen einer benutzerdefinierten Ausnahme von Wert sein, da SiedatabaseName
die Ausnahme zusammen mit anderen hilfreichen Informationen zur Ausnahme hinzufügen können.quelle
Abgesehen von den bereits gegebenen Antworten können Sie auch sagen, dass dies davon abhängt, was Sie erwarten.
Wenn Sie eine Protokolldatei lesen möchten und diese nicht vorhanden ist, möchten Sie einen Fehler oder nur einen leeren String (oder ein leeres String-Array) auslösen?
Wenn ich einen Standardwert zurückgeben würde (wie eine leere Zeichenfolge), würde ich einfach den Inhalt der Funktion in a einschließen
try-catch
(aber nur für erwartete Fehler) und den Standardwert imcatch
Block zurückgeben, während ich den tatsächlichen Inhalt imtry
Block zurückgeben würde.Dies würde drei mögliche Situationen hinterlassen:
quelle
Lassen Sie die richtige Methode versuchen, die Datei zu öffnen, während Sie keine Ahnung vom vollständigen Dateinamen haben, z. B. spezielle Dateinamen (z. B. Gerätedateien und UNC-Pfade ):
In einigen Fällen können andere Dateimethoden fehlschlagen, das Öffnen der Datei ist jedoch erfolgreich.
Einige Beispiele für spezielle Dateinamen sind:
quelle