Fehlerbehandlung - Hochschule Darmstadt

Werbung
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
Herunterladen