Komponenten-basierte Entwicklung Teil 4: Exceptions

Ähnliche Dokumente
1 Fehler-Objekte: Werfen, Fangen, Behandeln

Übungen zu Middleware Universität Erlangen-Nürnberg Informatik 4, 2007 Z-Java-Exceptions.fm

15 Fehlerobjekte: Werfen, Fangen, Behandeln

! 1. Unterklassen und Vererbung! 2. Abstrakte Klassen und Interfaces! 3. Modularität und Pakete! 4. Ausnahmen (Exceptions) II.4.

Einführung in die Programmierung mit Java

15 Fehlerobjekte: Werfen, Fangen, Behandeln

II.4.4 Exceptions - 1 -

15 Fehlerobjekte: Werfen, Fangen, Behandeln. Idee. Fehlerklassen. Fehlerklassen

Ausnahmebehandlung. Ausnahmen werfen (auslösen) Eigene Ausnahmen definieren. Ausnahmen abfangen. Ausnahmen definieren

Grundlagen der Programmierung Prof. H. Mössenböck. 16. Ausnahmen (Exception Handling)

Ausnahmen (Exceptions)

Mögliche Implementierung von intern():

Programmieren I. Fehlerbehandlung Exceptions. Heusch 2. Bd, 3 Ratz 10. Institut für Angewandte Informatik

Selectionsort Beispiel

15 Fehlerobjekte: Werfen, Fangen, Behandeln

15 Fehlerobjekte: Werfen, Fangen, Behandeln. Idee. Fehlerklassen. Fehlerklassen

15 Fehlerobjekte: Werfen, Fangen, Behandeln

9. Ausnahmebehandlung

II.4.4 Exceptions - 1 -

Java : Fehlerbehandlung.

Kapitel 11: Ausnahmebehandlung

Vorlesung 10. Sitzung Grundlegende Programmiertechniken

Grundlagen der Fehlerbehandlung. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 06: Ausnahme- und Fehlerbehandlung in Java.

Einführung in die Programmierung für NF. Fehler und Ausnahmen

Kapitel 9. Ausnahmebehandlung in Java. Skript zur Vorlesung Einführung in die Programmierung

Gliederung Grundlagen Schlüsselworte try-catch Fehlerobjekte Fehlerklassen Schlüsselwort finally Schlüsselwort throws selbst erstellte Exceptions

Ausnahmen. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Kapitel 12: Ausnahmen und Ausnahmebehandlung

9. Ausnahmebehandlung

Sortieralgorithmen. Nachfolgend wird die Menge der ganzen Zahlen und die darauf definierte Relation betrachtet.

Ausnahmen. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Einstieg in die Informatik mit Java

Abschnitt 7: Weitere Konzepte der oo Programmierung in Java

Liste Programmieren Java Überblick

Umgang mit Fehlern. Sinn von Ausnahme-/Fehlerobjekten Dokumentation Umgang mit Fehlern Eigene Fehlerklassen

Ausnahmebehandlung PK11W-16,

Ausnahmen. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 27.6.

Zuverlässigkeit von Programmen: Behandlung von Ausnahmesituationen

Ausnahmen. Dr. Philipp Wendler. Zentralübung zur Vorlesung Einführung in die Informatik: Programmierung und Softwareentwicklung

Robuste Programme durch Ausnahmebehandlung

Exceptions. INE2 M. Thaler, Office TG ZHAW, M. Thaler, K. Rege, G. Burkert, E. Bazzi

Ausnahmen. Exceptions. Definition Ausnahmen erzeugen Ausnahmen abfangen Ausnahmen weiterleiten. Dr. Beatrice Amrhein

Ausnahmen. Philipp Wendler. Zentralübung zur Vorlesung Einführung in die Informatik: Programmierung und Softwareentwicklung

9. Fehler und Ausnahmen Grundlagen der Programmierung 1 (Java)

Ausnahmen. Dr. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Vorlesung Informatik II

Java Einführung Exception Handling. Kapitel 17

Überblick. Peer Kröger (LMU München) Einführung in die Programmierung WS 16/ / 854

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 14/15. Kapitel 11. Fehler und Ausnahmen 1

Einführung in die Programmierung für NF

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 13/14. Kapitel 11. Fehler und Ausnahmen

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 12/13. Kapitel 11. Fehler und Ausnahmen

Einführung in die Informatik

Soll die Programm-Ausführung nicht beendet werden, muss der Fehler abgefangen werden. NumberFormatException

Wo sind wir? Rudolf Berrendorf FH Bonn-Rhein-Sieg Programmiersprache Java 280

Kapitel 10. Programmierkurs. Grundlagen von Exceptions Behandlung von Exceptions

Einführung in die Programmierung

Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer. Programmiertechnik Ausnahmen

Johannes Unterstein - TINF16 - Java - Sommersemester 2017 JAVA. Weiterführende Spracheigenschaften

Exception. 6. Exceptions. Die Klasse java.lang.exception. Fehlermeldung. Klassenname. Ort des Auftretens

9. Ausnahmebehandlung

EINFÜHRUNG IN DIE PROGRAMMIERUNG

EINFÜHRUNG IN DIE PROGRAMMIERUNG

Java Fehlerbehandlung

Ausnahmenbehandlung in Java. Dr. Horst Treiblmaier Abteilung für Wirtschaftsinformatik WU Wien

Kapitel 9: Klassen und höhere Datentypen. Selektoren

Java - Fehler im Code. Leibniz Universität IT Services Anja Aue

Prinzip des Exception Handling

Objektorientierte Programmierung. Kapitel 9: Exceptions I

(Ausnahmebehandlung)

Exceptions - Klausuraufgaben

Einführung in die Programmierung Blockkurs Java

Exceptions. Prof. Dr. Margarita Esponda SS M. Esponda-Argüero

3. Exceptions. Hintergrund: Programmieren auf der Basis von Verträgen. Kundenklasse. Lieferantenklasse

Ausnahmen. Gilbert Beyer und Annabelle Klarl. Einführung in die Informatik. Zentralübung zur Vorlesung Einführung in die Informatik

Javakurs für Anfänger

Javakurs zu Informatik I. Henning Heitkötter

7. Java Fehler und Ausnahmen

Grundlagen der Programmierung. Kapitel 9: Ausnahmen. Überblick. Fehlerbehandlung in Software-Systemen. Ziel der Vorlesung

Programmiertechnik Ausnahmen

Exceptions. CoMa-Übung VII TU Berlin. CoMa-Übung VII (TU Berlin) Exceptions / 1

Lösungsvorschläge zur Nachklausur zum Kurs 1618 Sommersemester 2001 am

1 Organisatorisches. 2 Compilezeit- und Laufzeitfehler. 3 Exceptions. 4 Try-Catch-Finally

Grundlagen der Programmierung! Kapitel 9: Ausnahmen! Überblick! Fehlerbehandlung in Software-Systemen! Ziel der Vorlesung!

1.7 Fehler- und Ausnahmebehandlung

Exceptions. CoMa-Übung VI TU Berlin. CoMa-Übung VI (TU Berlin) Exceptions / 19

Teil II. Objektorientierte Programmierung und objektorientierter Entwurf

Die abstrakte Klasse Expression:

1 Abstrakte Klassen, finale Klassen und Interfaces

Beispiel: Methode mit einem Fehler. Diese Methode wird problematisch, wenn von außen eine Dauer von 0 Sekunden angegeben wird, etwa im Aufruf

Transkript:

Komponenten-basierte Entwicklung Teil 4: Exceptions 31.10.14 1

Definitionen I Exception = Ausnahme = Situation, in der während einer Operation eine der Bedingungen des Typs bzw. der Klasse verletzt wird Jede Klasse definiert Bedingungen, den gültigen Zustand der Werte von den Attributen definieren. Eine Exception liegt also vor, wenn eine Operation ausgeführt wird, die zu einem Zustand führt, der die Bedingung des Typs bzw. der Klasse verletzt. 2

Definitionen II - Beispiele Integer-Variable mit größtem Wert wird um 1 erhöht (Überlauf) Array wird mit einem zu kleinen oder zu großen Wert indiziert Division durch 0 Funktionen mit falschen Werten Kein Speicher im RAM oder auf der Platte vorhanden 3

Behandlung I Aktion1 IF.. Behandlung1 ELSE Aktion2 IF.. Behandlung2 Aktion1 Aktion2 Aktion3 IF.. Behandlung1 IF.. Behandlung2 ELSE Aktion3 Vermischte Behandlung Getrennte Behandlung 4

Behandlung II Die getrennte Behandlung führt zu leichter verständlichen Strukturen, da der wesentliche Algorithmus klar in einem Stück definiert ist. Die Mischung von Aktivitäten und Abfragen, ob es geklappt hat, sowie den damit verbundenen if-then-else-konstruktionen ist schwer zu durchschauen, besonders dann, wenn die Routinen kurz sein sollen, z.b. bis zu 20 Zeilen. Daher wird die Benutzung der Exceptions empfohlen. 5

Beispiel für Division durch 0 I public class Main { static int division(int a, int b) { return a/b; public static void main(string[] args) { int numb1= 10, numb2= 0, div; div= division(numb1,numb2); System.out.println(numb1+" durch "+numb2+" ist "+div); Exception in thread "main" java.lang.arithmeticexception: / by zero at except1.main.division(main.java:6) at except1.main.main(main.java:10) 6

Eine Ausnahme auslösen I Eine Ausnahme liegt vor, wenn eine mit der Ausnahme korrespondierende Bedingung verletzt ist und dies festgestellt wird. Englisch: throwing an exception Eine Ausnahme wird dann geworfen. Aber auch: Eine Ausnahme wird behandelt, wenn ein zu der Ausnahme gehörender Block ausgeführt wird. Englisch: catching an exception Eine Ausnahme wird dann gefangen, wenn ein die Ausnahme behandelnder Block ausgeführt wird. 7

Beispiel für Division durch 0 II public static void main(string[] args) { int numb1= 10, numb2= 2, div; try { numb2= 0; div= division(numb1,numb2); System.out.println(numb1+" durch "+numb2+" ist "+div); catch (Exception ex) { System.out.println("Gefangen!"); System.out.println(ex); System.out.println("Weiterlauf..."); Überwachen Fangen Im try-block wird das Werfen von Exceptions überwacht, im catch-block werden die Ausnahmen gefangen. Bei der Division durch 0 wird die Exception von der ausführenden virtuellen Maschine geworfen. 8

Überwachen und Fangen I 9

Überwachen und Fangen II Es können unterschiedliche Arten von Ausnahmen gefangen und entsprechend unterschiedlich behandelt werden. Bei jeder Ausnahme wird ein Objekt einer bestimmten Klasse erzeugt, das im catch-teil deklariert und dort über eine catchlokale Variable benutzt werden kann: catch (Exception ex) { Ist eine Ausnahme behandelt, also am Ende des catch-blocks, wird die lokale catch-variable hier ex - vernichtet, was in der Regel zur Vernichtung des Exception-Objekts führt. Damit eine Exception abgefangen werden kann, muss eine Klasse definiert sein, die von der fest bestimmten Oberklasse Throwable abgeleitet ist. Diese Klasse symbolisiert die Ausnahme und enthält alle erforderlichen Angaben zur Behandlung. 10

Klassenhierarchie der Ausnahmen I (Auszug) 11

Klassenhierarchie der Ausnahmen II Klasse Error: Hierzu gehören alle Probleme des Java-Interpreters, nicht die Programmierfehler. Klasse Exception: Die Klasse Exception umfasst alle "normalen" Ausnahmen, also alle Programmierfehler. Klasse RunTimeException: Programmierfehler, die auch außerhalb eines try-blocks auftreten dürfen Klasse IOException: Ausnahmen, die durch Input/Output entstehen, aber nicht unbedingt Fehler sind, aber innerhalb eines try-blocks auftreten müssen Klassen SelbstDefiniert: Durch Programmierer/innen festgestellte und signalisierte Ausnahmen, die innerhalb eines try-blocks auftreten müssen 12

Fangen von Ausnahmen I catch (Exception1 ex) { catch (Exception2 ex) { catch (Exception3 ex) { Ablauf beim Fangen einer Exception: 1) Eine Ausnahme wird im try-block geworfen. 2)Die catch-deklarationen werden von vorne nach hinten durchsucht, ob die geworfene Ausnahme zur angegebenen Ausnahme passt. 3)Passt sie, wird der catch-block betreten. Tut sie es nicht, wird die nächste catch-deklaration untersucht. 4)Wird keine gefunden, wird die Ausnahme weiter an den Aufrufer der betreffenden Methode gereicht. 13

Fangen von Ausnahmen II Wird in der catch-deklaration eine der oberen Klassen in der Hierarchie angegeben, wie z.b. Exception, dann werden Ausnahmen dieser Klasse und samt aller Unterklassen durch den catch-abschnitt abgefangen. Das bedeutet, dass die speziellen Ausnahmen immer zuerst angegeben werden, während die allgemeinen, zusammenfassenden Ausnahmen am Ende stehen sollten. catch (Exception ex) { A catch (ArithmeticException ex) { B Schlecht! In diesem Beispiel würde der Block B nie ausgeführt werden, weil Exception allgemeiner ist und damit ArithmeticException umfasst. 14

Weiterleiten von Ausnahmen I static int[] a = new int[2]; static void func() { try { a[2]= 6; catch (ArrayIndexOutOfBoundsException ex) { System.out.println("Array Exception gefangen!"); System.out.println(ex.toString()); throw ex; static void catchandthrow() { try { func(); catch (Exception ex) { System.out.println("Exception aus func() gefangen!"); System.out.println(ex); System.out.println("Weiterlauf..."); 15

Weiterleiten von Ausnahmen II Eine Ausnahme wird auf zwei Arten weiter geleitet: Implizit aufgrund fehlender Behandlung (siehe erstes Beispiel der Division durch 0: dort wird die Ausnahme zum Aufrufer der Routine division() weiter geleitet) Explizit in einer Behandlung durch throw ExceptionObjekt Derjenige, der eine Ausnahme feststellt, erzeugt ein Exception- Objekt, das mit dem throw-konstrukt geworfen wird. Beim Weiterleiten wird das erzeugte Exception-Objekt erneut beim Werfen benutzt. Beim Weiterleiten kann auch die Art der Ausnahme geändert werden, indem ein neu generiertes Exception-Objekt geworfen wird (rethrow). 16

Das Exception-Objekt I String getmessage() Throwable getcause() String tostring() Gibt die Fehlermeldung wieder, die beim Erzeugen des Objekts übergeben wurde Liefert ein Exception-Objekt, das die ursprüngliche Ausnahme symbolisiert Konvert das Exception-Objekt in einen String zur Ausgabe void printstacktrace() Es wird der Aufruf-Stack ausgegeben. StackTraceElement[] getstacktrace() Der Aufruf-Stack wird in Form eines Feldes geliefert. 17

Das Exception-Objekt II (3) public class Exception6ExcObject { (4) static int[] a= new int[2]; (5) static void func() { (6) try { (7) a[2]= 6; (8) (9) catch (ArrayIndexOutOfBoundsException ex) { (10) ex.printstacktrace(); (11) (12) (13) public static void main(string[] args) { (14) func(); (15) (16) java.lang.arrayindexoutofboundsexception: 2 at exception6.exc.object.exception6excobject.func(exception6excobject.java:7) at exception6.exc.object.exception6excobject.main(exception6excobject.java:14) 18

finally I Der durch finally eingeleitete Block wird immer ausgeführt, also sowohl im Fehlerfall als auch im Normalfall. Dann wird hinter dem finally weiter gemacht, jedenfalls wenn nicht mit return gearbeitet wird. Wird der catch-block mit return abgeschlossen, so wird trotzdem noch der finally-block ausgeführt. Wird der catch-block mit mit System.exit() beendet, dann ist wirklich ohne finally-block Schluss. Das Terminieren (return oder exit()) innerhalb von catch oder finally-blöcken ist schlechter Programmierstil. Aufgabe des finally-blocks: Aufräumaktionen Schließen von Dateien Leeren von Puffern bei Input/Output 19

finally II 20

Beispiel für finally I RandomAccessFile file= null; try { file= new RandomAccessFile("blabla.txt","r"); file.seek(1000); int bit16= file.read(); file.close(); catch (FileNotFoundException ex) { System.out.println("File not found"); catch (IOException ex) { System.out.println("IOException"); finally { try { if(file!=null) { file.close(); catch (IOException ex) { Geschachtelte Ausnahme- Behandlung 21

Beispiel für finally II - Bemerkungen Wenn Ressourcen belegt werden, besteht der typische Ablauf, dass im finally-teil die Ressourcen wieder freigegeben werden. Die Struktur (Schema) des letzten Beispiels ist typisch für File- IO. Es können auch Exceptions während der Behandlung von Ausnahmen auftreten! Das Schließen einer Datei kann eine Exception werfen. Es kann auch sein, dass die Datei noch gar nicht geöffnet wurde, d.h. vor dem close() muss dies abgefragt werden. Eine Ausnahme gilt mit Verlassen des catch-blocks als vollständig behandelt, d.h. es geht dann normal weiter. Wird erneut eine Exception geworfen, so gilt diese. Geschachtelte Exceptions gibt es nicht. try/catch/finally-blöcke sind Blöcke mit lokalen Variablen, die am Ende der Blöcke vernichtet werden. 22

Checked und Unchecked Exceptions Es gibt in Java zwei Arten von Exceptions: Unchecked Exceptions Diese können, müssen aber nicht explizit behandelt werden. Alle Exceptions der Gruppen Error und RunTimeException gehören dazu. Bisher wurde nur diese Art behandelt. Checked Exceptions Diese müssen in einem try-block geworfen werden. Diese müssen entweder behandelt oder weiter geleitet werden. Wenn sie weiter geleitet werden, müssen sie im Routinen-Kopf mit dem Schlüsselwort throws angegeben werden. Diese Angaben gehören zur Signatur. Der Compiler prüft, ob eine Methode mit einer Exception in der Signatur aufgerufen wird und ob dies innerhalb eines try-blocks erfolgt. 23

Selbstdefinierte Exception-Klasse I public static void doit(int param) throws WrongParameter { if(param<0) { throw new WrongParameter("param is negative"); System.out.println("param= "+param); public static void main(string[] args) { try { doit(2); DoIt(-1); catch (WrongParameter ex) { System.out.println(ex.getMessage()); 24

Selbstdefinierte Exception-Klasse II public class WrongParameter extends Exception { public WrongParameter() { public WrongParameter(String msg) { super(msg); Ergebnis param= 2 param is negative Dies ist der typische Aufbau einer Exception-Klasse. Der String-Parameter im Konstruktor definiert den String, der mit getmessage() in der Behandlung geholt werden kann. Exception-Klassen erfüllen daher zwei Zwecke: Transport von Informationen vom Ort der Feststellung zur Behandlung: sie sind eigentlich Nachrichten. Klassifikation der Exception aufgrund der Einbindung in die Exception-Hierarchie. 25

Ergänzungen (ab Java 1.7) Es können in einem catch-block mehrere Exceptions mit Oder (einfacher senkrechter Strich) zusammengefasst werden: catch (except1 except2 except3 Variable) { Auch hier muss die Hierarchie beachtet werden, also nur Geschwister in der Hierarchie verknüpfen. Regeln: Immer so nah wie nur möglich eine Ausnahme behandeln. Immer so viele Informationen wie zur sinnvollen Behandlung wie möglich über set()-methoden dem Exception-Objekt übergeben. Möglichst nie mit { eine Ausnahme ignorieren. 26

Komponenten Jede Exception offenbart ein Implementierungsdetail tiefer liegender Schichten. Daher sollten Komponenten nie Exceptions aus der Implementierung werfen. Stattdessen werden spezielle für die Komponenten-Schnittstelle konzipierte (abstrakte) Exceptions geworfen. Interne Exceptions werden dann in diesen abstrakten umgewandelt (per rethrow). In der Praxis sind fast alle Frameworks dazu übergegangen immer unchecked Exceptions zu werfen. Grund: Der/Die Programmierer/in kann eh nichts mit den Internata zur Laufzeit(!) anfangen; weiter gereichte Exceptions sind dann immer festgestellte Programmierfehler in der Benutzung des Frameworks. 27

Nun wieder etwas entspannen... 28