CodeGym /Kurse /C# SELF /Abfangen von Datei-Ausnahmen ( try-catch)

Abfangen von Datei-Ausnahmen ( try-catch)

C# SELF
Level 38, Lektion 1
Verfügbar

1. Einführung

Dateioperationen stehen fast immer im Zusammenhang mit äußeren Umständen: eine Datei kann gelöscht oder verschoben werden, von einem anderen Programm gesperrt sein, dem Benutzer können plötzlich die Rechte ausgehen oder der Datenträger hat keinen freien Platz mehr. All das kann zu Ausnahmen führen — speziellen Situationen, in denen die Programmausführung unterbrochen wird und ein Exception-Objekt "geworfen" wird (Exception). Wenn man so eine Ausnahme nicht abfängt und behandelt, beendet sich das Programm mit einem Fehler und zeigt dem Benutzer furchterregenden roten Text in der Konsole (oder — noch schlimmer — stürzt still ab).

In C# verwendet man für solche Situationen den try-catch-Block (oder einfach gesagt die "Fehlerfalle"). Er erlaubt es nicht nur, den Fehler zu "fangen", sondern auch ruhig zu entscheiden, was als Nächstes zu tun ist: eine freundliche Meldung anzeigen, anbieten, eine andere Datei zu wählen, den Fehler ins Log schreiben oder einfach den Vorgang erneut versuchen.

In realen Anwendungen

Wenn du einen Konsolenrechner schreibst, kann man vermutlich auch ohne Dateifehlerbehandlung auskommen. Wenn du aber eine Anwendung zur Dokumentenverarbeitung für ein Unternehmen oder ein Spiel schreibst, das gespeicherte Spielstände sichert — solche Fehler nicht zu behandeln ist wie Seiltanzen ohne Sicherung: früher oder später passiert etwas.

2. Erinnerung: Arbeit mit Ausnahmen

Grundsyntax von try-catch

Bevor wir zu konkreten Dateisituationen kommen, erinnern wir die Grundsyntax der try-catch-Konstruktion (die wir schon in Vorlesungen zu Exceptions gesehen haben):


try
{
    // Hier steht Code, der eine Ausnahme "werfen" kann
}
catch (Exception ex)
{
    // Hier fangen wir alle möglichen Ausnahmen... Aber besser so nicht!
    Console.WriteLine("Etwas ist schiefgelaufen: " + ex.Message);
}

Im try steht potenziell gefährlicher Code, im catch steht, was zu tun ist, wenn etwas schiefgeht.

Programmierer-Witz: "try-catch ist wie ein digitaler Tarnumhang für Fehler. Der Fehler ist da, aber du siehst ihn nicht!"

Datei-Ausnahmen

Beim Arbeiten mit Dateien in .NET begegnet man häufig Ausnahmen — z.B. beim Erstellen eines Streams, Lesen oder Schreiben. Hier sind einige typische Szenarien und die dazugehörigen Ausnahmen:

  • Datei nicht gefunden → FileNotFoundException
  • Kein Zugriff auf Datei/Verzeichnis → UnauthorizedAccessException
  • Pfadprobleme (z.B. ungültige Zeichen, zu langer Pfad) → PathTooLongException, ArgumentException
  • Datei wird von einem anderen Prozess genutzt → IOException
  • Kein freier Speicherplatz auf der Festplatte → IOException

Am häufigsten sind bei Dateioperationen gerade die von IOException abgeleiteten Exceptions. Alle diese Typen erben vom Basistyp System.Exception.

3. Praxis: Fehler beim Arbeiten mit Dateien fangen und behandeln

Schauen wir uns typische Fälle anhand von Beispielen unserer "sich entwickelnden Anwendung" an: Nehmen wir an, wir wollen eine Begrüßung aus einer Datei lesen, verarbeiten und dem Benutzer ausgeben. Wir fügen hier Fehlerprüfung mit try-catch hinzu.

Beispiel 1: Behandlung "Datei nicht gefunden"


string filePath = "hello.txt";

try
{
    string greeting = File.ReadAllText(filePath);
    Console.WriteLine("Inhalt der Datei: " + greeting);
}
catch (FileNotFoundException ex)
{
    Console.WriteLine("Datei nicht gefunden! Überprüfe, dass die Datei " + filePath + " existiert.");
    // Wir können zusätzlich Details ausgeben
    Console.WriteLine("Technische Details: " + ex.Message);
}

Wenn die Datei "hello.txt" fehlt, stürzt das Programm nicht ab, sondern gibt eine freundliche Meldung aus. So macht man die Anwendung robust gegenüber "dummen" Benutzerfehlern.

Beispiel 2: Zugriffsrechte verletzt

Kompliziertere Situation: die Datei existiert, aber wir haben keine Leserechte (z.B. wurde nur Schreibzugriff gesetzt oder die Datei liegt in einem geschützten Verzeichnis).


try
{
    string secret = File.ReadAllText("C:\\Windows\\System32\\config.txt");
}
catch (UnauthorizedAccessException ex)
{
    Console.WriteLine("Kein Zugriff auf die Datei! Versuche das Programm als Administrator zu starten.");
    Console.WriteLine("Technischer Grund: " + ex.Message);
}

Beispiel 3: Allgemeine IOException

Manche Fehler hängen mit Sperren zusammen (z.B. hält ein anderer Prozess die Datei offen), mit fehlendem Speicherplatz oder Hardwareproblemen:


try
{
    File.WriteAllText("important.txt", "Wichtige Information!");
}
catch (IOException ex)
{
    Console.WriteLine("Fehler bei der Dateioperation: wahrscheinlich wird die Datei von einem anderen Programm genutzt oder der Datenträger hat nicht genug Platz.");
    Console.WriteLine("Technischer Grund: " + ex.Message);
}

4. Mehrere Ausnahmen abfangen: selektive Behandlung

Manchmal will man unterschiedlich auf verschiedene Exception-Typen reagieren. In .NET kann man mehrere catch-Blöcke angeben — von spezifischeren zu allgemeineren (ansonsten beschwert sich der Compiler laut und deutlich).


try
{
    string content = File.ReadAllText("file.txt");
    Console.WriteLine(content);
}
catch (FileNotFoundException ex)
{
    Console.WriteLine("Datei nicht gefunden.");
}
catch (UnauthorizedAccessException ex)
{
    Console.WriteLine("Kein Zugriff auf die Datei!");
}
catch (IOException ex)
{
    Console.WriteLine("Andere Eingabe-/Ausgabe-Fehler: " + ex.Message);
}

Wichtig: Wenn du catch (Exception ex) zuerst platzierst, machen die anderen Blöcke keinen Sinn, weil der Basistyp alles abfängt!

5. Verschachtelte try-catch und Wiederholungsversuche

Manchmal willst du nicht nur den Fehler behandeln, sondern dem Benutzer die Chance geben, "es zu reparieren" — z.B. einen Pfad zu einer existierenden Datei einzugeben:


string filePath;
string content;
int attempts = 0;
const int maxAttempts = 3;

do
{
    Console.Write("Gib den Pfad zur Datei ein: ");
    filePath = Console.ReadLine();

    try
    {
        content = File.ReadAllText(filePath);
        Console.WriteLine("Inhalt der Datei:\n" + content);
        break;
    }
    catch (FileNotFoundException)
    {
        Console.WriteLine("Datei nicht gefunden! Versuch es noch einmal.");
    }
    catch (UnauthorizedAccessException)
    {
        Console.WriteLine("Kein Zugriff auf die Datei! Versuch eine andere Datei.");
    }
    attempts++;
}
while (attempts < maxAttempts);

if (attempts == maxAttempts)
    Console.WriteLine("Zu viele fehlgeschlagene Versuche.");

Dieser Code ist eine kleine "freundliche Oberfläche" für Benutzer, die vergessen haben, wo sie die Datei gespeichert haben.

6. Typische Fehler und Besonderheiten: von Faulheit zu Bewusstheit

Ein sehr häufiger Fehler bei Anfängern (und sogar erfahrenen Entwicklern) ist, alle Ausnahmen pauschal zu fangen, also einfach catch (Exception) zu schreiben und "Ein Fehler ist aufgetreten!" auszugeben, ohne die Ursachen zu bedenken. Dieser Ansatz ist aus mehreren Gründen schlecht. Erstens verschleiert er echte Logikfehler in der Anwendung. Zweitens können dadurch andere, nicht dateibezogene Fehler (z.B. Tippfehler im Code oder ein mathematischer Fehler) unbemerkt bleiben, und die Suche nach der echten Ursache dauert erheblich länger.

Viel besser ist es, explizit nur die Fehler zu fangen, die du sinnvoll behandeln kannst. Wenn unklar ist, welche Ausnahme aufgetreten ist, lass sie besser "durchfallen" — also fang sie nicht: dann stürzt die Anwendung, aber du bekommst den Stacktrace und erkennst, was zu beheben ist.

Besonderheit: Manche Exceptions können verschachtelte Ursachen haben (InnerException). Diese sind praktisch für eine detailliertere Diagnose, besonders beim Schreiben von Error-Logs.

Ein weiterer Punkt — wenn nach einem catch-Block das Fortsetzen des Programms keinen Sinn macht (z.B. wenn die Hauptkonfigurationsdatei nicht geöffnet werden konnte), kann man die Ausführung mit return beenden oder die Exception erneut werfen (throw;), um nicht halbfertige "Zombie"-Programme mit eingeschränkter Funktionalität zu produzieren.

2
Aufgabe
C# SELF, Level 38, Lektion 1
Gesperrt
Behandlung mehrerer Ausnahmen beim Schreiben in eine Datei
Behandlung mehrerer Ausnahmen beim Schreiben in eine Datei
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION