C# Exception Handling: try, catch, finally, throw & Best Practices
Ausnahmebehandlung in C#
try– Block, der überwacht wird.catch– Behandelt eine bestimmte Exception.finally– Wird immer ausgeführt (Cleanup).throw– Löst Exception explizit aus.
Syntax
try
{
// Code, der Exception werfen kann
}
catch (SpecificException ex)
{
// Behandlung für SpecificException
}
catch (AnotherException ex)
{
// Behandlung für AnotherException
}
catch (Exception ex) // Basistyp zuletzt
{
// Generische Behandlung
}
finally
{
// Cleanup (Dateien schließen, Locks freigeben, etc.)
}
Wichtige Exception-Klassen
Alle Exceptions erben von System.Exception. Wichtige vordefinierte Typen:
| Exception | Ursache |
|---|---|
ArgumentNullException | Null-Argument wo nicht erlaubt |
ArgumentOutOfRangeException | Argument außerhalb gültigen Bereichs |
InvalidOperationException | Objektzustand unpassend für Operation |
NullReferenceException | Zugriff auf Member von null |
DivideByZeroException | Division durch Null (Integer) |
IndexOutOfRangeException | Ungültiger Array-Index |
FileNotFoundException | Datei nicht gefunden |
IOException | Allgemeiner I/O-Fehler |
FormatException | Ungültiges Format (z. B. Parse) |
OverflowException | Arithmetischer Überlauf |
Beispiel: Division durch Null abfangen
using System;
public class Divider
{
public void Divide(int a, int b)
{
try
{
int result = a / b;
Console.WriteLine($"Result: {result}");
}
catch (DivideByZeroException ex)
{
Console.WriteLine($"Fehler: {ex.Message}");
}
finally
{
Console.WriteLine("Operation abgeschlossen.");
}
}
}
// Nutzung
new Divider().Divide(10, 0);
// Ausgabe:
// Fehler: Attempted to divide by zero.
// Operation abgeschlossen.
Eigene Exceptions definieren
Ableitung von Exception (oder ApplicationException für anwendungsspezifische).
[Serializable]
public class TemperatureZeroException : Exception
{
public TemperatureZeroException() { }
public TemperatureZeroException(string message) : base(message) { }
public TemperatureZeroException(string message, Exception inner) : base(message, inner) { }
protected TemperatureZeroException(SerializationInfo info, StreamingContext context) : base(info, context) { }
}
// Verwendung
public class Temperature
{
public int Value { get; set; }
public void Check()
{
if (Value == 0) throw new TemperatureZeroException("Temperatur darf nicht Null sein.");
}
}
Best Practices
- Nur fangen, was Sie behandeln können – nicht
catch (Exception)ohne Grund. - Nicht für Steuerfluss nutzen – Exceptions sind teuer.
finally/using/IDisposablefür Ressourcen-Cleanup.- Original-Exception beim Weiterwerfen erhalten:
throw;(nichtthrow ex;– Stack Trace geht verloren). - Benutzerdefinierte Exceptions mit
[Serializable]und Konstruktoren nach Muster. ArgumentNullExceptionetc. für Validierung in öffentlichen APIs werfen.
C Sprache
- C# using-Anweisungen meistern: Importe, Aliase und statische Direktiven
- C-Dateiverwaltung: I/O mit fopen, fprintf, fread & fseek meistern
- Python Exception Handling meistern: try, except, else und finally erklärt
- Java Exception Handling meistern: Try, Catch, Finally, Throw & Throws erklärt
- C++ Exception Handling meistern: Praktische try, catch, throw Beispiele
- Python Exception Handling meistern: try, except, finally und raise effektiv nutzen
- C++ Signalverarbeitung meistern: Sichere Interrupt-Verwaltung und saubere Programmausführung
- Java 9 Modulsystem: Module, jlink & Custom Runtime Images erstellen
- SPS vs. DCS: Das richtige Automatisierungssystem wählen
- Liebherr PHS Allround: Flexibles, modulares Palettenhandling für Hochleistungsfertigung