15. C++ vertieft (IV): Ausnahmen (Exceptions)

Ähnliche Dokumente
Praxisorientierte Einführung in C++ Lektion: "Exceptions"

Java Fehlerbehandlung

5.13 Umgang mit Fehlern

SEP 114. Design by Contract

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

Einstieg in die Informatik mit Java

Embedded Software. Der C Präprozessor. Sichere objektbasierte Entwicklung dank C Präprozessor. Prof. Dr. Nikolaus Wulff

Einführung in Javadoc

Große Übung Praktische Informatik 1

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

Programmieren von Webinformationssystemen

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

Java-Schulung Grundlagen

Einführung in die Programmierung Blockkurs Java

Teil II. Objektorientierte Programmierung und objektorientierter Entwurf

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

Algorithmen und Datenstrukturen

14. Tutorium zu Programmieren

6 Speicherorganisation

Steueranweisungen. Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/

Objektorientierte Programmierung

std::cerr << "unerwartete sonstige Exception" << std::endl; return EXIT_FAILURE; // main() mit Fehlerstatus beenden

Fehler die bei der Programmerstellung passieren können teilweise vom Compiler erkannt werden

Java I Vorlesung Exceptions

Javakurs für Anfänger

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

Inhalt Streams Eingabe / Ausgbe in C Dateizugriff in C Eingabe / Ausgabe in C++ Dateizugriff in C++ Error Handling

9. Fehlerbehandlung Advanced Programming Techniques. Wintersemester 2009 / 2010 Prof. Dr. Bernhard Humm Hochschule Darmstadt, FB Informatik

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

Tipps und Hinweise zum Bezug der Beitragssatzdatei V5.0

THE GO PROGRAMMING LANGUAGE. Michael Karnutsch & Marko Sulejic

Programmentwicklung ohne BlueJ

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

Programmieren von Webinformationssystemen

Nathan Burgener. Design by Contract. Modul SWE

Spec# Einführung. Formale Software-Entwicklung Seminar SS 07 Universität Karlsruhe Hilal Akbaba

Kurze Einführung in die Programmiersprache C++ und in Root

Praxisorientierte Einführung in C++ Lektion: "Smart-Pointer"

Jürgen Bayer. MDI-Anwendungen in C#

Klassendefinitionen verstehen

Das erste C++ Programm

Aufgabe 1: Quer durch Java (5 Punkte) Bearbeiten Sie die folgenden Aufgaben:

UNIVERSITÄT ULM Fakultät für Ingenieurswissenschaften und Informatik Institut für Datenbanken und Informationssysteme

Programmieren in Java

Informatik 1 ( ) D-MAVT F2010. Logik, Schleifen. Yves Brise Übungsstunde 4

5.4 Klassen und Objekte

Einführung in den Einsatz von Objekt-Orientierung mit C++ I

Übungspaket 29 Dynamische Speicherverwaltung: malloc() und free()

Die Programmiersprache C99: Zusammenfassung

Praktikum Betriebssysteme 1. Aufgabe (1)

1. Sei der String s = new String( xyzzy ) gegeben. Welcher Aufruf verändert s?

Objektorientierung: Klassen und Objekte

Klausur C++ #1 Jahr: 2001; Dozent: Dipl.Ing. Sorber

Annehmende Schleife do while

Alltagsnotizen eines Softwareentwicklers

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

Primitive Datentypen

Programmieren in Java

Grundlagen der Programmierung Prof. H. Mössenböck. 10. Klassen

Universität Augsburg, Institut für Informatik Sommersemester 2005 Prof. Dr. Werner Kießling 15. Oktober 2005 Dr. Alfons Huhn, Timotheus Preisinger

Praxisorientierte Einführung in C++ Lektion: "Kontrollstrukturen"

Programmieren I. Strategie zum Entwurf von Klassen. Beispiele. Design von Klassen. Dr. Klaus Höppner. Beispiel: Bibliothek

Objektorientierte Programmierung. Kapitel 18: Exceptions II

Programmieren in C++ Überladen von Methoden und Operatoren

Vorkurs C++ Programmierung

Zählen von Objekten einer bestimmten Klasse

Java - Programmierung - Objektorientierte Programmierung 1

Variablen manipulieren per JDI

Quiz und Übungen. C++ Übung am 19. Mai 2016

Objektorientiertes Programmieren mit C++ für Fortgeschrittene

Einführung in I/O und File-Handling in C ++

1 Polymorphie (Vielgestaltigkeit)

Exception Handling, Tracing und Logging C#.NET

Objects First With Java A Practical Introduction Using BlueJ. Mehr über Vererbung. Exploring polymorphism 1.0

PHP Code Konventionen Um einen einheitlichen Code zu generieren, der von jedem gelesen werden kann, müssen folgende Konventionen eingehalten werden.

Design by Contract with JML

RO-Tutorien 3 / 6 / 12

Beispiel: DB-Mock (1/7)

1 Einführung Erste Schritte Programmierkurs Datentypen Weiterführende Programmierung

PIWIN 1 Übung Blatt 5

Java Einführung Methoden. Kapitel 6

Die Programmiersprache C Eine Einführung

Praktikum Ingenieurinformatik. Termin 5. Felder, Kurvendarstellung mit Excel

Einführung in die Programmierung 1

<Trainingsinhalt> C# programmieren

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Javakurs zu Informatik I. Henning Heitkötter

Transkript:

Was kann schon schiefgehen? Öffnen einer Datei zum Lesen oder Schreiben std::ifstream input("myfile.txt"); 15. C++ vertieft (IV): Ausnahmen (Exceptions) Parsing int value = std::stoi("12 8"); Speicherallokation std::vector<double> data(manymillions); Invalide Daten int a = b/x; // what if x is zero? 399 400 Möglichkeiten der Fehlerbehandlung Globale Fehlervariablen Keine (inakzeptabel) Globale Fehlervariable (Flags) Funktionen, die Fehlercodes zurückgeben Objekte, die Fehlercodes speichern Ausnahmen Typisch für älteren C-Code Nebenläufigkeit ist ein Problem Fehlerbehandlung nach Belieben. Erfordert grosse Disziplin, sehr gute Dokumentation und übersäht den Code mit scheinbar unzusammenhängenden Checks. 401 402

Rückgabe von Fehlercodes Rückgabe von Fehlercodes Beispiel Jeder Aufruf einer Funktion wird mit Ergebnis quittiert. Typisch für grosse APIs (OS Level). Dort oft mit globalen Fehlercodes kombiniert. 16 Der Aufrufer kann den Rückgabewert einer Funktion prüfen, um die korrekte Ausführung zu überwachen. #include <errno.h>... pf = fopen ("notexisting.txt", "r+"); if (pf == NULL) { fprintf(stderr, "Error opening file: %s\n", strerror( errno )); else { //... fclose (pf); 16 Globaler error code thread-safety durch thread local storage. 403 404 Fehlerstatus im Objekt Exceptions Fehlerzustand eines Objektes intern im Objekt gespeichert. Beispiel int i; std::cin >> i; if (std::cin.good()){// success, continue... Exceptions unterbrechen den normalen Kontrollfluss Exceptions können geworfen (throw) und gefangen (catch) werden Exceptions können über Funktionengrenzen hinweg agieren. 405 406

Beispiel: Exception werfen Beispiel: Exception fangen class MyException{; int main() { f(4); return 0; terminate called after throwing an instance of MyException Aborted 407 class MyException{; int main(){ try{ f(4); catch (MyException e){ std::cout << "exception caught\n"; f(0) f(1) f(2) f(3) f(4) main() exception caught 408 Resourcen werden geschlossen Wann Exceptions? class MyException{; struct SomeResource{ ~SomeResource(){std::cout << "\n"; ; SomeResource x; int main(){ try{f(5); catch (MyException e){ std::cout << "exception caught\n"; exception caught 409 Exceptions werden für die Behandlung von Fehlern benutzt. Verwende throw nur, um einen Fehler zu signalisieren, welcher die Postcondition einer Funktion verletzt oder das Fortfahren des Codes unmöglich macht Verwende catch nur, wenn klar ist, wie man den Fehler behandeln kann (u.u. mit erneutem Werfen der Exception) Verwende throw nicht um einen Programmierfehler oder eine Verletzung von Invarianten anzuzeigen (benutze stattdessen assert) Verwende Exceptions nicht um den Kontrollfluss zu ändern. Throw ist nicht ein besseres return. 410

Warum Exceptions? Warum Exceptions? Das: int ret = f(); if (ret == 0) { //... else { //...code that handles the error... sieht auf den ersten Blick vielleicht besser / einfacher aus als das: try { f(); //... catch (std::exception& e) { //...code that handles the error... 411 Die Wahrheit ist, dass Einfachstbeispiele den Kern der Sache nicht immer treffen. Return-Codes zur Fehlerbehandlung übersähen grössere Codestücke entweder mit Checks oder die Fehlerbehandlung bleibt auf der Strecke. 412 Darum Exceptions Beispiel 2 Wertetyp mit Garantie: Werte im gegebenen Bereich. Beispiel 1: Evaluation von Ausdrücken (Expression Parser, Vorlesung Informatik I), siehe http://codeboard.io/projects/46131 Eingabe: 1 + (3 * 6 / (/ 7 )) Fehler tief in der Rekursionshierarchie. Wie kann ich eine vernünftige Fehlermeldung produzieren (und weiterfahren)? Müsste den Fehlercode über alle Rekursionsstufen zurückgeben. Das übersäht den Code mit checks. class Range{ public: Range(){ Range (const T& v) : value (v) { if (value < min) throw Underflow (); Fehlerbehandlung im Konstruktor! if (value > max) throw Overflow (); operator const T& () const {return value; private: T value; ; 413 414

Fehlertypen, hierarchisch class RangeException {; class Overflow : public RangeException {; class Underflow : public RangeException {; class DivisionByZero: public RangeException {; class FormatError: public RangeException {; Operatoren Range<T, min, max> operator/ (const Range<T, min, max>& a, const Range<T, min, max>& b){ if (b == 0) throw DivisionByZero(); return T (a) T(b); std::istream& operator >> (std::istream& is, Range<T, min, max>& a){ T value; if (!(is >> value)) throw FormatError(); a = value; return is; Fehlerbehandlung im Operator! 415 416 Fehlerbehandlung (zentral) Range<int, 10,10> a,b,c; try{ std::cin >> a; std::cin >> b; std::cin >> c; a = a / b + 4 (b c); std::cout << a; catch(formaterror& e){ std::cout << "Format error\n"; catch(underflow& e){ std::cout << "Underflow\n"; catch(overflow& e){ std::cout << "Overflow\n"; catch(divisionbyzero& e){ std::cout << "Divison By Zero\n"; 417