Skip to main content
Programme stoßen auf Unvorhergesehenes: eine fehlende Datei, eine falsche Eingabe, eine Division durch null. Dieses Kapitel zeigt, wie du damit umgehst, Fehler findest und Daten dauerhaft speicherst.

Drei Arten von Fehlern

Syntaxfehler zeigt der Compiler sofort an. Laufzeitfehler heißen in C# Exceptions (Ausnahmen). Logikfehler findest du nur durch Testen und Debuggen.

Exceptions behandeln

Eine Exception unterbricht das Programm, bis jemand sie abfängt. Dafür dient try und catch:
Den Fehler selbst bekommst du über eine Variable:
Fange nur Fehler ab, die du auch sinnvoll behandeln kannst. Ein leeres catch { } versteckt Probleme und macht die Suche später sehr mühsam. Muss ein allgemeiner catch (Exception) sein, gib den Fehler mit throw; am Ende weiter.

Häufige Exceptions

Eigene Fehler auslösen

Mit throw meldest du selbst einen Fehler, wenn eine Methode mit unsinnigen Werten aufgerufen wird:
Vermeide Exceptions für normale Abläufe. Ob eine Eingabe eine Zahl ist, prüfst du besser mit int.TryParse. Es ist schneller und braucht kein try.

Debugging

Der Debugger hält das Programm an einer Stelle an, damit du Variablen ansehen und Schritt für Schritt weitergehen kannst.
1

Haltepunkt setzen

Klicke links neben die Zeilennummer oder drücke F9. Das Programm stoppt dort.
2

Mit Debugger starten

Starte mit F5. Am Haltepunkt siehst du die aktuellen Werte aller Variablen.
3

Schritt für Schritt gehen

Mit F10 führst du die Zeile aus, mit F11 springst du in eine aufgerufene Methode hinein. F5 läuft bis zum nächsten Haltepunkt.
Die Tastenkürzel gelten für Visual Studio. In Visual Studio Code sind sie sehr ähnlich: F5 startet, F9 setzt einen Haltepunkt, F10 und F11 gehen Schritt für Schritt.

Dateien lesen und schreiben

Die Klasse File im Namespace System.IO deckt die häufigsten Fälle mit einem Aufruf ab.
Ein relativer Pfad wie notizen.txt bezieht sich auf das Arbeitsverzeichnis des Programms. Bei dotnet run ist das der Projektordner.

Pfade zusammensetzen

Baue Pfade nie von Hand zusammen, sondern mit Path:

Dateien sicher öffnen

Streams und andere Ressourcen, die belegt werden, schließt using automatisch, selbst bei einem Fehler:

Dateizugriff mit Fehlerbehandlung

Für große Dateien liest du besser Zeile für Zeile mit StreamReader, statt alles auf einmal in den Speicher zu laden.

Weiter

4.2.8 Beispielprojekte

Das Gelernte in vier kleinen Programmen anwenden.