9. Fehlerbehandlung Advanced Programming Techniques Wintersemester 2009 / 2010 Prof. Dr. Bernhard Humm Hochschule Darmstadt, FB Informatik 1 Prof. Dr. Bernhard Humm, Hochschule Darmstadt, FB Informatik: Advanced Programming Techniques, WS 09/10. 25.11.2009 Agenda Motivation Motivation Exceptions in Java Professionelle Fehlerbehandlung Beispiel Kein Computersystem ohne Fehler Fehler stellen unerwünschtes Verhalten während der Ausführung eines Computersystems dar – … aufgrund von Programmierfehlern, z.B. Division durch Null – … aufgrund von technischen Problemen, z.B. Netzwerkfehlern – … aufgrund fehlerhafter Bedienung, z.B. Anwender gibt größeres “von”-Datum als “bis”-Datum ein – … aufgrund von Ausnahmen im Geschäftsprozess, z.B. Überweisung nicht möglich aufgrund einer Kontensperre Fehler kommen vor: – Programmierfehler können durch gutes Design und Tests reduziert werden, aber in komplexen Systemen nie komplett vermieden werden – Technische Probleme können reduziert werden, z.B. durch redundante Hardware, können aber auch nicht komplett vermieden werden – Fehlerhafte Bedienung kann durch eine ergonomische Benutzeroberfläche reduziert werden, aber nie komplett vermieden werden – Ausnahmen im Geschäftsprozess können immer vorkommen und sind unabhängig vom Computersystem Fehler können nicht vermieden werden. Daher müssen wir sie behandeln! 3 Prof. Dr. Bernhard Humm, Hochschule Darmstadt, FB Informatik: Advanced Programming Techniques, WS 09/10. 25.11.2009 Ist das Problem mit Exceptions gelöst? Exceptions sind Sprachmittel aktueller Programmiersprachen wie Java, C++, C# etc. Aber: Exceptions führen nicht automatisch zu einem guten Design für Fehlerbehandlung. Sie sind sogar manchmal gar nicht angemessen zur Behandlung von Fehlern! Manchmal führen Exceptions zu neuem Spaghetti-Code: Exceptions sind das moderne GoTo – GoTo considered harmful! Es gibt in der Java Community bislang keine allgemein akzeptierten Muster für Fehlerbehandlung, z.B. – Wann Checked Exceptions verwenden, wann Unchecked Exceptions? – Wo werden Exceptions gefangen? – Wie werden Exceptions behandelt? Lehrbücher zu Architektur schweigen sich meist zu Fehlerbehandlung aus (positive Ausnahme: J. Siedersleben – Moderne Softwarearchitektur) 4 Prof. Dr. Bernhard Humm, Hochschule Darmstadt, FB Informatik: Advanced Programming Techniques, WS 09/10. 25.11.2009 Agenda Motivation Exceptions Exceptions in Java in Java Professionelle Fehlerbehandlung Beispiel Wiederholung: Exceptions in Java geschützter Block ... Statement; Statement; Statement; ... Fehlerbehandlungscode ... Statement; Statement; Statement; ... Ausnahmebehandler (exception handler) Wenn im geschützten Block ein Fehler (eine Ausnahme) auftritt: • Ausführung des geschützten Blocks wird abgebrochen • Fehlerbehandlungscode wird ausgeführt • Programm setzt nach dem geschützten Block fort 6 Prof. Dr. Bernhard Humm, Hochschule Darmstadt, FB Informatik: Advanced Programming Techniques, WS 09/10. 25.11.2009 Try-Anweisung in Java try { p(...); q(...); r(...); geschützter Block } catch (Exception1 e) { error(...); } catch (Exception2 e) { error(...); void q(...) { ... throw new Exception2(); ... } Auslösen einer Ausnahme Ausnahmebehandler } catch (Exception3 e) { error(...); } Vorteile • Fehlerfreier Fall und Fehlerfälle sind sauberer getrennt • Man kann nicht vergessen, einen Fehler zu behandeln (Compiler prüft, ob es zu jeder möglichen Ausnahme einen Behandler gibt) 7 Prof. Dr. Bernhard Humm, Hochschule Darmstadt, FB Informatik: Advanced Programming Techniques, WS 09/10. 25.11.2009 Throw-Anweisung Löst eine Ausnahme aus throw new MyException("invalid operation", 17); "Wirft" ein Ausnahmeobjekt mit entsprechenden Fehlerinformationen • • • • 8 bricht normale Programmausführung ab sucht passenden Ausnahmebehandler (catch-Block) führt Ausnahmebehandler aus und übergibt ihm Ausnahmeobjekt als Parameter setzt nach try-Anweisung fort, zu der der catch-Block gehört Prof. Dr. Bernhard Humm, Hochschule Darmstadt, FB Informatik: Advanced Programming Techniques, WS 09/10. 25.11.2009 catch-Blöcke und finally-Block try { ... } catch (MyException e) { Out.println(e.getMessage() + ", error code = ", + e.getErrorCode()); } catch (NullPointerException e) { ... } catch (Exception e) { ... } finally { ... } • Passender catch-Block wird an Hand des Ausnahme-Typs ausgewählt • catch-Blöcke werden sequentiell abgesucht Achtung: speziellere Ausnahme-Typen müssen vor allgemeineren stehen • Am Ende wird (optionaler) finally-Block ausgeführt egal, ob im geschützten Block ein Fehler auftrat oder nicht 9 Prof. Dr. Bernhard Humm, Hochschule Darmstadt, FB Informatik: Advanced Programming Techniques, WS 09/10. 25.11.2009 Arten von Exceptions in Java Ungeprüfte (Unchecked Exceptions) werden beispielsweise von der Java-VM ausgelöst • Division durch 0 • Zugriff über null-Zeiger • Indexüberschreitung ArithmeticException NullPointerException ArrayIndexOutOfBoundsException wenn sie nicht behandelt werden, stürzt das Programm mit einer Fehlermeldung ab Geprüfte Ausnahmen (Checked Exceptions) Müssen vom Client-Code gefangen (catch) oder weitergeworfen werden (throws-Anweisung) • vordefinierte Ausnahmen z.B. FileNotFoundException • selbst definierte Ausnahmenz.B. MyException Compiler prüft, ob sie abgefangen werden 10 Prof. Dr. Bernhard Humm, Hochschule Darmstadt, FB Informatik: Advanced Programming Techniques, WS 09/10. 25.11.2009 Agenda Motivation Exceptions in Java Professionelle Professionelle Fehlerbehandlung Fehlerbehandlung Beispiel Die Fehlerbehandlung kann das Geheimnisprinzip verletzen … try { result = Kontokorrent.ueberweise(100, konto1, konto2); } catch (DatabaseNotAvailableException e) { // was tun, sprach Zeuss? } … class Dependency Client Serv er Client Aufrufer 12 Serv er Schnittstelle Implementierung Der Aufrufer einer Operation (Client) kennt nur die Schnittstelle, nicht dessen Implementierung Der aufgetretene Fehler gibt aber Auskunft über die Implementierung. Der Server zwingt den Client, den Fehler zu behandeln. Die Fehlerbehandlung verletzt das Geheimnisprinzip. Der Client weiß nicht so recht, was er tun soll („ich wusste gar nicht, dass da eine Datenbank im Spiel ist. Ich kenne mich nur mit Überweisungen aus“) Prof. Dr. Bernhard Humm, Hochschule Darmstadt, FB Informatik: Advanced Programming Techniques, WS 09/10. 25.11.2009 Lösung: Klassifikation von Fehlern in fachliche Fehler (A-Fehler) und technische Fehler (T-Fehler) Fachliche Fehler (A-Fehler): Im Sinne der Schnittstelle zu erwartender Fehler Beispiele: – Operation „Geld abheben“ einer Bankanwendung: Kreditlimit überschritten – Operation „Datei öffnen“ eines Betriebssystems: Datei nicht vorhanden Technische Fehler (T-Fehler): Fehler, die sich aus der Implementierung und deren Technik ergeben. Beispiele: – Operation „Geld abheben“ einer Bankanwendung : Datenbank nicht verfügbar – Operation „Datei öffnen“ eines Betriebssystems: Fileserver abgestürzt – Verletzte Vor-/Nachbedingungen (sind keine fachlichen Fehler, sondern Programmierfehler!) Der Anbieter einer Operation führt die Klassifikation der Fehler durch 13 Prof. Dr. Bernhard Humm, Hochschule Darmstadt, FB Informatik: Advanced Programming Techniques, WS 09/10. 25.11.2009 Fachliche Fehler (A-Fehler) Können und müssen vollständig aufgezählt werden! Sind Bestandteil der Schnittstelle Design-Alternativen: – Rückgabewert – Geprüfte Ausnahme (checked Exception) Beispiele: int ueberweise (int betrag, Konto von, Konto nach) post: result = 0, falls Überweisung erfolgreich post: result = -1, falls Kreditlimit überschritten … void ueberweise (int betrag, Konto von, Konto nach) throws KreditlimitException error: KreditlimitException, falls Kreditlimit überschritten … Der Aufrufer muss den fachlichen Fehler fachlich behandeln und beispielsweise den Anwender informieren! 14 Prof. Dr. Bernhard Humm, Hochschule Darmstadt, FB Informatik: Advanced Programming Techniques, WS 09/10. 25.11.2009 Technische Fehler (T-Fehler) Sind abhängig von der Implementierung und deren Technologie Können im Allgemeinen nicht vollständig aufgezählt werden (Murphy‘s Law: „if anything can go wrong it will“) Design-Empfehlungen: – Kein Bestandteil der Schnittstelle! – Verwende stets unchecked Exceptions (RuntimeException oder Error) für T-Fehler – Werden Fremdkomponenten gerufen, die sich nicht an diese Konvention halten: packe die gefangenen checked exceptions in neue Runtime Exceptions (Exception Chaining) Beispiel: try { result = Kontokorrent.ueberweise(100, konto1, konto2); } catch (DatabaseNotAvailableException e) { throw new RuntimeException(e); } Der Aufrufer kann den Fehler nicht behandeln und tut es auch nicht! 15 Prof. Dr. Bernhard Humm, Hochschule Darmstadt, FB Informatik: Advanced Programming Techniques, WS 09/10. 25.11.2009 Wer behandelt technische Fehler? Der ExceptionHandler Design-Empfehlung: – An einer zentralen Stelle im System werden alle technischen Fehler gefangen und dem ExceptionHandler übergeben – Der ExceptionHandler bündelt die Logik für die Fehlerbehandlung try { f(); ... } catch (Throwable e) { exceptionHandler.handleException(e) } ... 16 class ExceptionHandler { … Object handleException(Throwable e){ // classify situation // perform corresponding action } ... } Prof. Dr. Bernhard Humm, Hochschule Darmstadt, FB Informatik: Advanced Programming Techniques, WS 09/10. 25.11.2009 Der ExceptionHandler klassifiziert technische Fehler nach ihrer Schwere und stößt erforderliche Aktionen an Katastrophe (globales schweres Problem): Das Gesamtsystem muss heruntergefahren werden Lokales schweres Problem: Die Benutzersession muss beendet werden. In beiden Fällen ist u. U. der Anwender zu informieren Behebbares Problem: Durch Retry oder Compensating Actions kann das Problem behoben werden Leichtes Problem: Das Problem wird protokolliert zur Unterstützung von Wartungsarbeiten (das muss auch für alle obigen Fälle erfolgen) und das System kann fortgesetzt werden 17 Prof. Dr. Bernhard Humm, Hochschule Darmstadt, FB Informatik: Advanced Programming Techniques, WS 09/10. 25.11.2009 Agenda Motivation Exceptions in Java Professionelle Fehlerbehandlung Beispiel Beispiel Beispiel: Der ExceptionHandler in einem betrieblichen Informationssystem cmp Application Kernel Facade «A Component» Dialog NameService A_UseCase_1' A_UseCase_n' Administration «Abstract T Component» Application Kernel Facade TechnicalConfiguration SystemsManagement ExceptionHandler A_UseCase_1 A_UseCase_n TransactionManager «Abstract T Compo... Transaction 19 «A Component» Application Component Prof. Dr. Bernhard Humm, Hochschule Darmstadt, FB Informatik: Advanced Programming Techniques, WS 09/10. 25.11.2009 Der Ablauf am Beispiel sd handle exception and repair Client Application Kernel Facade Transaction Application «interface» «interface» «interface» «interface» «interface» A_UseCase_1' ExceptionHandler :TransactionManager SystemsManagement A_UseCase_1 Client someMethod(arguments) beginTransaction() :Transaction someMethod(arguments) handle(exception) :Exception rollbackTransaction(transaction) shutDown 20 Prof. Dr. Bernhard Humm, Hochschule Darmstadt, FB Informatik: Advanced Programming Techniques, WS 09/10. 25.11.2009