C# Tutorial Try Catch Exception

Mit Try und Catch kannst du Fehler, also Exceptions (Ausnahmen) abfangen und behandeln

Was sind denn aber eigentlich diese Exceptions? In C# gibt es eigentlich keine richtigen Fehler oder Errors. Wenn dein Programm einen Fehler hat, dann wird eine sogenannte Exception (Ausnahme) geworfen. Wenn du diese Exception nicht behandelst sondern sie einfach ignorierst, dann wird dein Programm sich höchstwahrscheinlich aufhängen oder komplett schließen. Das wäre eine wirklich blöde Erfahrung für den Anwender deines Programmes.

Also was tun? Wir können die Exceptions mit einem Try-Catch Block abfangen und stattdessen einen anderen Code ausführen (behandeln). Wie das geht sehen wir uns im weiteren Verlauf dieses Try Catch C# Grundlagen Tutorials an.

Was sagt mir die Exception?

Eine Ausnahme (Exception) ist immer von einem bestimmten Typ. Der Name der Ausnahme gibt dir schon einen Hinweis auf den Fehler. So gibt es beispielsweise die DivideByZeroException, die geworfen wird wenn du Versuchst eine Zahl durch Null zu teilen (was nicht möglich ist):

C# DividedByZeroException Try Catch

Nehmen wir an du erstellst eine Taschenrechner-App und einer deiner Nutzer teilt eine Zahl durch 0, dann bekommt dein Programm im Hintergrund einen Error (Exception) und das Programm stürzt ab weil du die Exception nicht behandelst. Die Lösung dafür folgt…

Was machen try und catch?

Anstatt dass die Taschenrechner-App abstürzt (weil die Exception nicht behandelt wurde) sollte dem Nutzer lieber angezeigt werden “Teilen durch 0 nicht möglich”.

Mit dem Keyword try können wir bestimmten Code ausführen. Mit einem dazugehörigen catch fangen wir dann eine (falls aufgetretene) Exception ab:

static void Main(string[] args)
{
  int x = 100;
  int divider = 0;
  
  int result;

  try 
  {
    result = x / divider;    
  } catch
  {
    Console.WriteLine("Es gab einen Error...");
  }

  Console.ReadKey();
}

Nochmal im Klartext, der in den try-Block geschriebene Code wird ausgeführt. Wenn keine Exception auftritt passiert nichts weiter (der Code läuft einfach weiter durch). Wenn der Code im try-Block aber einen Error (Exception) produziert, dann wird stattdessen der Code aus dem catch-Block aufgerufen.

Aufgabe: Probier es aus! Schnapp dir den Code aus dem Beispiel von oben und produziere extra ein paar Exceptions

Mit catch kann man noch mehr anstellen

Im Beispiel von oben fangen wir eigentlich noch gar keine bestimmte Exception ab. Wir führen nur anderen Code aus wenn wir eine Exception im allgemeinen bekommen. Wenn wir Beispielsweise wissen möchten welche Exception wir bekommen haben, dann müssen wir den catch-Block etwas modifizieren:

int divider = 0;

try 
{
  int result = 100 / divider;    
} catch (Exception e)
{
  Console.WriteLine("Es gab einen Error: " + e);
  // In der Konsole steht dann die jeweilige Exception
}

Console.ReadKey();

Jetzt fangen wir jede Exception ab. Es könnte jetzt also rein theoretisch immer noch eine anderen Exception sein und nicht unsere erwartete DividedByZero-Exception. Deshalb modifizieren wir den catch-Block noch etwas spezifischer:

try 
{
  int result = 100 / divider;    
} catch (DivideByZeroException e) // <- Es wurde auf jeden Fall versucht durch 0 zu teilen
{
  Console.WriteLine("Teilen durch null ist nicht möglich");
}

Jetzt fangen wir auch mit Sicherheit ausschließlich eine DividedByZeroException ab.

Du musst selber einschätzen welche Fehler in deinem Code vorkommen können. Vielleicht möchtest du, dass wenn eine andere Exception auftritt der Nutzer eine andere Info-Meldung erhält:

try 
{
  int result = 100 / divider;    
} catch (Exception e)
{
  if(e is DividedByZeroException)
    Console.WriteLine("Teilen durch null ist nicht möglich");
  else 
    Console.WriteLine("Es wurde nicht durch 0 geteilt aber es gab einen anderen Fehler");
}

An diesem Punkt ist erstmal genug gesagt über Try, Catch und Exceptions. Du weißt jetzt wie du dein Programm nicht abstürzen lässt wenn ein Fehler auftritt. Eine kurze Info noch: Du kannst auch deine eigene Art von Exceptions erstellen. Dafür ist es an diesem Punkt aber noch zu früh.