Programmieren Tutorium 12

Exceptions

Gliederung

  • Exceptions allgemein
  • Exceptions in Java
  • Dynamische Programmierung

Exceptions allgemein

Ohne Exceptions

int fd = open(file_name, O_RDWR);
if (fd == -1) handle_error("open");

struct stat sb;
if (fstat(fd, &sb) == -1) handle_error("fstat");

char *addr = mmap(NULL, sb.st_size, /* more parameters */);
if (addr == MAP_FAILED) handle_error("mmap");
  • Probleme
    • Vermischung von Programmlogik und Fehlerbehandlung
    • Fehlerausgaben im Programm verstreut
    • Keine Trennung von Algorithmik und Benutzerinteraktion

Mit Exceptions

  • Unterbrechung des normalen Kontrollflusses
  • Behandlung an beliebiger Stelle im Call-Stack
  • Einfache Identifikation des Fehlertyps
  • Beliebige Fehlerdetails mitgeben

Exceptions sind wie Hundewelpen

Welpen, Biatch

  • Sie sind toll!
  • Sie werden „geworfen“
  • Manche müssen „gefangen“ werden
  • Zu viele können auch nervig werden
    • Tipp: in einen Sack packen und ab in den nächsten Fluss

Mal im ernst, was sind Exceptions?

  • In Deutsch: Ausnahmen
  • Normale Objekte mit Sonderstatus
  • Im Fehlerfall werden sie „geworfen“
  • Unterbrechen den normalen Programmfluss
  • „Steigen nach oben“ bis sie „gefangen“ werden

Exceptions in Java

throw

void foo(int bar) throws IOException, FileNotFoundException {
    if (...) throw new IOException();
    if (...) throw new FileNotFoundException();
    // Unchecked: (später mehr)
    if (...) throw new IllegalArgumentException();
}

try-catch

try {
    ...
} catch (ExceptionType e) {
    ...
} catch (ExceptionType2 | ExceptionType3 e) {
    ...
}

Checked vs. Unchecked

  • Unchecked
    • RuntimeException, Error und Unterklassen
    • Deuten auf Programmierfehler hin
      • Beheben, nicht abfangen
    • Bsp: NullPointerException
  • Checked
    • Alle Anderen
    • Können evtl. zur Laufzeit behoben werden
      • Abfangen/weiter reichen
    • Verursacht durch fehlende Dateien, falschen Input, etc.

Javas Exception-Hierarchie

Exception-Hierarchie

finally

try {
    ...
} catch (ExceptionType e) {
    ...
} finally {
    ...
}
  • Wird in jedem Fall ausgeführt
  • Nützlich um beispielsweise Resourcen zu schließen

try-with-resources

try (BufferedReader reader = new BufferedReader(new FileReader("f.txt"))) {
    ...
} catch (IOException e) {
    ...
}
  • try-with-resources schließt Resourcen automatisch

Big No Nos

try {
    for (int i = 0; array[i] != x; ++i);
    return true;
} catch (ArrayIndexOutOfBoundsException e) {
    return false;
}
  • Exceptions zur Programmsteuerung (s. o.)
  • Riesige try-Blöcke
  • Leere catch-Blöcke
  • Catch von Exception oder Throwable

Dynamische Programmierung

…kann dann erfolgreich eingesetzt werden, wenn das Optimierungsproblem aus vielen gleichartigen Teilproblemen besteht, und eine optimale Lösung des Problems sich aus optimalen Lösungen der Teilprobleme zusammensetzt

Feierabend!

http://