Benutzer mit den meisten Antworten
Wie logische Fehler mittels Code abfangen??

Frage
-
SERVUS LEUTE,
habe mich momentan in die Dateienprogrammierung der SYSTEM.IO eingearbeitet, und komme soweit auch klar damit.
Mir ist allerdings aufgefallen, dass wenn ich auf Dateien zugreifen möchte, die nicht existieren bzw. wenn ich ganz allgemein Operationen auf nicht vorhandene Dateien als User tätige, immer wieder die Fehlermeldung"Ein Ausnahmefehler des Typs System.ArgumentNullException ist in mscorlib.dll aufgetreten"das Programm abstürzen lässt.
Diesen Umstand würde ich gerne durch eine Fehlerbehandlung mittels Code so abfangen, dass das Programm nicht abstürzt.
Hat jemand uff die Schnelle ein Idee, wie ich das konzeptionell mit welchen Befehlen am Besten bewerkstellige?
Vorab wie immer vielen Dank auf die sicherlich zahlreichen Statements......
So long......- Bearbeitet tklustig Sonntag, 14. August 2016 11:08
Antworten
-
Hi,
es gibt zwei Dinge, die man machen kaan:1. mit File.Exists prüfen, die gewünschte Datei vorhanden ist und
2. mit Try/Catch weitere Fehler abfangen.
Das könnte dann so aussehen:
Friend Sub Execute() Dim path = "c:\temp\x.txt" Try If File.Exists(path) Then Using rdr As New StreamReader(path) While Not rdr.EndOfStream Dim str = rdr.ReadLine Console.WriteLine(str) End While End Using Else Console.WriteLine($"Datei {path} nicht vorhanden") End If Catch ex As Exception Console.WriteLine(ex.Message) End Try End Sub
--
Viele Grüsse
Peter Fleischer (MVP, Partner)
Meine Homepage mit Tipps und Tricks
Kommas richtig setzen! Leben retten!
Wir essen Opa.
Wir essen, Opa.- Als Antwort vorgeschlagen Dark Alice Mittwoch, 17. August 2016 08:35
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 26. August 2016 12:48
-
Hallo,
Peter hat Recht, soweit es das Testen auf die Existenz der Datei (und ggf. auch des Verzeichnisses geht), aber das ist nicht alles:
Eine ArgumentException (oder davon abgeleitete Ausnahme) ist generell ein Programmierfehler. Sie kann durch Prüfen der Argumente verhindert werden. Und entweder wird die Methode erst gar nicht ausgeführt, weil der Benutzer etwas nicht richtig eingegeben hat. Oder man korrigiert das Argument so weit es möglich ist.
z. B. File.Open: Dort sind alle Argument<x>Exceptions durch Prüfung zu vermeiden. Eine fehlendes Verzeichnis kann man durch Anlage via Directory.CreateDirectory u. U. vermeiden, wenn die Datei angelegt wird oder werden kann. Zu beachten ist, dass File.Exists nur die Existenz prüft, es kann immer noch zu Fehler prüfen, siehe Dokumentation.
Zu lange bzw. ungültige Pfade sollte man nur in Ausnahmefällen prüfen, das machen die Systemmethoden i. d. R. besser, zumal in .NET 4.6.2 Änderungen anstehen.
Eine UnautorizedException kann man nur abfangen, da ein vorheriger Test nur äußerst aufwändig möglich wäre und kaum so realisiert werden kann, wie es das Betriebssystem es tut.
Was temporäre Datei angeht, sollte man auf Path.GetTempPath zurückgreifen bzw. sich über Path.GetTempFileName einen Dateinamen erzeugen lassen. Etwas wie C:\TEMP kann für Entwicklungszwecke ganz nützlich sein, dort die Rechte entsprechend setzen.
Gruß Elmar
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Donnerstag, 18. August 2016 05:45
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 26. August 2016 12:49
Alle Antworten
-
Hi,
es gibt zwei Dinge, die man machen kaan:1. mit File.Exists prüfen, die gewünschte Datei vorhanden ist und
2. mit Try/Catch weitere Fehler abfangen.
Das könnte dann so aussehen:
Friend Sub Execute() Dim path = "c:\temp\x.txt" Try If File.Exists(path) Then Using rdr As New StreamReader(path) While Not rdr.EndOfStream Dim str = rdr.ReadLine Console.WriteLine(str) End While End Using Else Console.WriteLine($"Datei {path} nicht vorhanden") End If Catch ex As Exception Console.WriteLine(ex.Message) End Try End Sub
--
Viele Grüsse
Peter Fleischer (MVP, Partner)
Meine Homepage mit Tipps und Tricks
Kommas richtig setzen! Leben retten!
Wir essen Opa.
Wir essen, Opa.- Als Antwort vorgeschlagen Dark Alice Mittwoch, 17. August 2016 08:35
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 26. August 2016 12:48
-
Hi,
wo sich die Dateien befinden, muss der Programmentwickler festlegen bzw. wissen. Ich nutze c:\temp für Dateien, die ich zwischenzeitlich ablege (z.B. für Tests) und dann auch, ohne zu überlegen, löschen kann.
--
Viele Grüsse
Peter Fleischer (MVP, Partner)
Meine Homepage mit Tipps und Tricks
Kommas richtig setzen! Leben retten!
Wir essen Opa.
Wir essen, Opa.- Bearbeitet Peter Fleischer Sonntag, 14. August 2016 19:23
-
Hallo,
Peter hat Recht, soweit es das Testen auf die Existenz der Datei (und ggf. auch des Verzeichnisses geht), aber das ist nicht alles:
Eine ArgumentException (oder davon abgeleitete Ausnahme) ist generell ein Programmierfehler. Sie kann durch Prüfen der Argumente verhindert werden. Und entweder wird die Methode erst gar nicht ausgeführt, weil der Benutzer etwas nicht richtig eingegeben hat. Oder man korrigiert das Argument so weit es möglich ist.
z. B. File.Open: Dort sind alle Argument<x>Exceptions durch Prüfung zu vermeiden. Eine fehlendes Verzeichnis kann man durch Anlage via Directory.CreateDirectory u. U. vermeiden, wenn die Datei angelegt wird oder werden kann. Zu beachten ist, dass File.Exists nur die Existenz prüft, es kann immer noch zu Fehler prüfen, siehe Dokumentation.
Zu lange bzw. ungültige Pfade sollte man nur in Ausnahmefällen prüfen, das machen die Systemmethoden i. d. R. besser, zumal in .NET 4.6.2 Änderungen anstehen.
Eine UnautorizedException kann man nur abfangen, da ein vorheriger Test nur äußerst aufwändig möglich wäre und kaum so realisiert werden kann, wie es das Betriebssystem es tut.
Was temporäre Datei angeht, sollte man auf Path.GetTempPath zurückgreifen bzw. sich über Path.GetTempFileName einen Dateinamen erzeugen lassen. Etwas wie C:\TEMP kann für Entwicklungszwecke ganz nützlich sein, dort die Rechte entsprechend setzen.
Gruß Elmar
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Donnerstag, 18. August 2016 05:45
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 26. August 2016 12:49