none
Wie logische Fehler mittels Code abfangen?? RRS feed

  • 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
    Sonntag, 14. August 2016 11:07

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.

    Sonntag, 14. August 2016 11:20
  • 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

    Sonntag, 14. August 2016 18:09
    Beantworter

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.

    Sonntag, 14. August 2016 11:20
  • Ah, sehr schön!1

    Etwas irritiert bin ich allerdings ob der Pfadangabe "C\temp\filename.txt"

    Sind bei VisualBasic sämtliche Dateien standardgemäß im temporären Ordner, oder war das einfach nur eine beliebige

    Pfadangabe von Dir??

    Sonntag, 14. August 2016 11:57
  • 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.


    Sonntag, 14. August 2016 13:38
  • Okay. Sinnig. werde ich übernehmen, diese Praxis. Danke && Ciao!

    Beende hiermit diesen Thread!

    Sonntag, 14. August 2016 14:58
  • 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

    Sonntag, 14. August 2016 18:09
    Beantworter