Οντοκεντρικόσ Προγραμματιςμόσ Ενότθτα 7: C++ TEMPLATES, ΤΠΕΡΦΟΡΣΩΗ ΣΕΛΕΣΩΝ, ΕΞΑΙΡΕΕΙ Χειριςμόσ Εξαιρζςεων Ιωάννθσ Χατηθλυγεροφδθσ Πολυτεχνικι χολι Σμιμα Μθχανικϊν Η/Τ & Πλθροφορικισ
Χειριςμόσ Εξαιρζςεων
Εξαιρζςεισ Εξαίρεςθ o Δείχνουν ότι κάποιο πρόβλθμα προζκυψε ςτθν εκτζλεςθ του προγράμματοσ o Κάτι μθ φυςιολογικό Χειριςμόσ Εξαιρζςεων o Resolve exceptions o Σο πρόγραμμα μπορεί να ςυνεχίςει τθν λειτουργία Controlled termination o Για δθμιουργία fault-tolerant programs 3/19
Try Catch Blocks Κϊδικασ C++ try { κώδικα πος μποπεί να πποκαλέζει εξαίπεζη catch (exceptiontype){ κώδικαρ για σειπιζμό εξαιπέζεων o Σο try μπλοκ περιζχει κϊδικα ο οποίοσ μπορεί να προκαλζςει εξαίρεςθ o Σα catch μπλοκ (1 ι περιςςότεραα): Λαμβάνουν και χειρίηονται τισ εξαιρζςεισ Μζςω παραμζτρου μποροφν να προςπελάςουν το αντικείμενο εξαίρεςθσ. 4/19
Παράδειγμα #include <iostream> #include <stdexcept> using namespace std; class DivideByZeroException : public out_of_range { public: DivideByZeroException(int n, string m) : mumerator(n), out_of_range(m){ int mumerator; ; double divide( int numerator, int denominator ) { if ( denominator == 0 ) throw DivideByZeroException(numerator,"attempted to divide with zero"); return static_cast< double >( numerator ) / denominator; int main(){ int a,b; try{ while ( cin >> a >> b ) divide(a,b); catch (out_of_range e){ cout << e.what(); το catch κομμάτι χειριηόμαςτε εξαιρζςεισ τφπου out_of_range ι παράγωγεσ τθσ ( όπωσ αυτι που φτιάξαμε ). Αν και δεν είναι υποχρεωτικό, εδϊ φτιάχνουμε δικό μασ τφπο εξαίρεςθσ, κλθρονομϊντασ από τον υπάρχων τφπο out_of_range. Μζςω του δθμιουργοφ μποροφμε να ορίςουμε τθν πλθροφορία που κα αποκθκεφουμε ςτθν εξαίρεςθ μζςω των οριςμάτων του. (πχ εδϊ μποροφμε να κρατάμε τον αρικμθτι τθσ πράξθσ). τον δθμιουργό τθσ κλάςθσ out_of_range μποροφμε να περνάμε μινυμα ςχετικό με το ςφάλμα το οποία κα είναι προςπελάςιμο μζςω τθσ μεκόδου what() που ζχει θ κλάςθ exception και παράγωγεσ τθσ. Με κλιςθ του δθμιουργοφ, δθμιουργοφμε εξαίρεςθ του τφπου που φτιάξαμε και τθν πετάμε με τθν εντολι throw. 5/19
Ροι εκτζλεςθσ θμείο ζγερςθσ εξαίρεςθσ (Throw point) o Σο ςθμείο ςτο μπλοκ try όπου εγείρεται εξαίρεςθ o Αν χειριςτεί θ εξαίρεςθ Σο πρόγραμμα προςπερνάει τον υπόλοιπο κϊδικα του try μπλοκ υνεχίηεται θ λειτουργία μετά τα catch μπλοκ o αν δεν χειριςτεί θ εξαίρεςθ Σερματίηεται θ λειτουργία Αν δεν προκφψει εξαίρεςθ o Σο πρόγραμμα αγνοεί τα catch blocks. 6/19
Τεχνικζσ Χειριςμοφ Εξαιρζςεων Αγνόθςθ εξαιρζςεων o Συπικό για προςωπικό (όχι εμπορικό) λογιςμικό o Σο πρόγραμμα μπορεί να αποτυγχάνει Σερματιςμόσ Προγράμματοσ o υνικωσ είναι κατάλλθλο o Δεν είναι κατάλλθλο για κρίςιμεσ εφαρμογζσ Set error indicators o Unfortunately, may not test for these when necessary Test for error condition o Call exit (<cstdlib>) and pass error code 7/19
Άμεςθ ζγερςθ εξαιρζςεων Εντολι throw o Εγείρει μια εξαίρεςθ Χριςθ όταν προκφπτει το ςφάλμα o Μποροφμε με «πετάξουμε» με τθν throw ςχεδόν οτιδιποτε ( αντικείμενα-εξαιρζςεισ, built-in τφπουσ όπωσ integer, κτλ.) throw myobject; throw 5; Αντικείμενα-Εξαιρζςεισ o Ζχουν ωσ κλάςθ βάςθσ τθν exception ( <exception> ) o Ο δθμιουργόσ μπορεί να ζχει ζνα αλφαρικμθτικό για περιγραφι του ςφάλματοσ. o Η περιγραφι μπορεί να ανακτθκεί μζςω τθσ μεκόδου what() 8/19
Επανζγερςθ Επανζγερςθ εξαίρεςθσ (rethrowing) o Χρθςιμοποιείται ςε catch μπλοκ, όταν δεν μπορεί να χειριςτεί θ εξαίρεςθ ϊςτε να επανεγερκεί o Can rethrow exception to another handler Goes to next enclosing try block Corresponding catch blocks try to handle Για να ξαναπετάξουμε εξαίρεςθ μζςα ςε catch block καλοφμε τθν εντολι throw (χωρίσ όριςμα ) 9/19
Λίςτα εξαιρζςεων ςυνάρτθςθσ Ορίηουμε τθν λίςτα των εξαιρζςεων που μπορεί να εγερκοφν ςτθν ςυνάρτθςθ αυτιν o Also called throw list int somefunction( double value ) throw ( ExceptionA, ExceptionB, ExceptionC ) { // σώμα σσνάρτησης o Η ςυνάρτθςθ μπορεί να πετάξει εξαιρζςεισ τφπου ExceptionA, ExceptionB, and ExceptionC (ι παράγωγεσ αυτϊν) Αν προκφψει άλλου είδουσ εξαίρεςθ (και δεν χειριςτεί μζςα ςτο ςϊμα τθσ ςυνάρτθςθσ με κάποιο catch block) προκφπτει απροςδόκθτο ςφάλμα και τερματίηει το πρόγραμμα o Αν δεν ορίςουμε λίςτα throw, μπορεί να πετάξει οποιαδιποτε o Αν ορίςουμε κενι λίςτα throw, δεν μπορεί να πετάξει καμία εξαίρεςθ 10/19
Παραδείγματα void function() throw(int){ throw 5; int main(){ try{ function(); catch(int){ cout << " handled"; handled (εγείρεται εξαίρεςθ αποδεκτοφ τφπου ςτθν function). Η main ζχει κατάλλθλο catch μπλοκ χειριςμοφ του τφπου οπότε χειρίηεται και τερματίηει κανονικά θ λειτουργία void function() throw(int){ throw 'k'; int main(){ try{ function(); catch(int){ cout << " handled"; Σερματιςμόσ με ςφάλμα Μθ αποδεκτόσ τφποσ εξαίρεςθσ. Δεν ζχει οριςτεί ο τφποσ char ςτθν λίςτα throw τθσ ςυνάρτθςθσ. void function() throw(int){ try{ throw 'k'; catch(...){ cout << "handled internally"; int main(){ try{ function(); catch(int){ cout << " handled"; handled internally (Εγείρεται εξαίρεςθ μθ αποδεκτοφ τφπου, ωςτόςο χειρίηεται εςωτερικά). Η main δεν «ενθμερϊνεται» ότι προζκυψε εξαίρεςθ ςτθν function 11/19
Παραδείγματα void function() throw(int, char){ try{ throw 'k'; catch(...){ cout << "handled internally"; throw; int main(){ try{ function(); catch(int){ cout << " handled"; handled internally Σερματίηει με ςφάλμα (Η εξαίρεςθ ςυλλαμβάνεται αρχικά εςωτερικά, ωςτόςο με τθν throw τθν πετάει ξανά ςτο παραπάνω επίπεδο (main), το οποίο δεν ζχει κατάλλθλο catch χειριςμοφ τθσ. void function() throw(int, char){ try{ throw 'k'; catch(...){ cout << "handled internally"; throw; int main(){ try{ function(); catch(char ch){ cout <<endl<< ch << " handled"; handled internally k handled Η εξαίρεςθ χειρίηεται και εςωτερικά και ςτθν main 12/19
Πρόςκετο Υλικό Μελετιςτε και τα παραδείγματα από το Κεφάλαιο 17 του βιβλίου: «C++ How to Program, 9/e Paul & Harvey Deitel» http://media.pearsoncmg.com/ph/esm/deitel/cpp_htp_9/code_examples/code_examples.zip 13/19
Χρθματοδότθςθ Σο παρόν εκπαιδευτικό υλικό ζχει αναπτυχκεί ςτo πλαίςιo του εκπαιδευτικοφ ζργου του διδάςκοντα. Σο ζργο «Ανοικτά Ακαδθμαϊκά Μακιματα ςτο Πανεπιςτιμιο Ακθνών» ζχει χρθματοδοτιςει μόνο τθν αναδιαμόρφωςθ του εκπαιδευτικοφ υλικοφ. Σο ζργο υλοποιείται ςτο πλαίςιο του Επιχειρθςιακοφ Προγράμματοσ «Εκπαίδευςθ και Δια Βίου Μάκθςθ» και ςυγχρθματοδοτείται από τθν Ευρωπαϊκι Ζνωςθ (Ευρωπαϊκό Κοινωνικό Σαμείο) και από εκνικοφσ πόρουσ. 14/19
θμείωμα Ιςτορικοφ Εκδόςεων Ζργου Σο παρόν ζργο αποτελεί τθν ζκδοςθ 1.0. 15/19
θμείωμα Αναφοράσ Copyright: Πανεπιςτιμιον Πατρϊν, Ιωάννθσ Χατηθλυγεροφδθσ, 2015. «Οντοκεντρικόσ Προγραμματιςμόσ». Ζκδοςθ: 1.0. Πάτρα 2015. Διακζςιμο από τθ δικτυακι διεφκυνςθ: https://eclass.upatras.gr/courses/ceid1105/ 16/19
θμείωμα Αδειοδότθςθσ Σο παρόν υλικό διατίκεται με τουσ όρουσ τθσ άδειασ χριςθσ Creative Commons Αναφορά, Μθ Εμπορικι Χριςθ Παρόμοια Διανομι 4.0 *1+ ι μεταγενζςτερθ, Διεκνισ Ζκδοςθ. Εξαιροφνται τα αυτοτελι ζργα τρίτων π.χ. φωτογραφίεσ, διαγράμματα κ.λ.π., τα οποία εμπεριζχονται ςε αυτό και τα οποία αναφζρονται μαηί με τουσ όρουσ χριςθσ τουσ ςτο «θμείωμα Χριςθσ Ζργων Σρίτων». [1] http://creativecommons.org/licenses/by-nc-sa/4.0/ Ωσ Μθ Εμπορικι ορίηεται θ χριςθ: που δεν περιλαμβάνει άμεςο ι ζμμεςο οικονομικό όφελοσ από τθν χριςθ του ζργου, για το διανομζα του ζργου και αδειοδόχο που δεν περιλαμβάνει οικονομικι ςυναλλαγι ωσ προχπόκεςθ για τθ χριςθ ι πρόςβαςθ ςτο ζργο που δεν προςπορίηει ςτο διανομζα του ζργου και αδειοδόχο ζμμεςο οικονομικό όφελοσ (π.χ. διαφθμίςεισ) από τθν προβολι του ζργου ςε διαδικτυακό τόπο Ο δικαιοφχοσ μπορεί να παρζχει ςτον αδειοδόχο ξεχωριςτι άδεια να χρθςιμοποιεί το ζργο για εμπορικι χριςθ, εφόςον αυτό του ηθτθκεί.
Διατιρθςθ θμειωμάτων Οποιαδιποτε αναπαραγωγι ι διαςκευι του υλικοφ κα πρζπει να ςυμπεριλαμβάνει: το θμείωμα Αναφοράσ το θμείωμα Αδειοδότθςθσ τθ διλωςθ Διατιρθςθσ θμειωμάτων το θμείωμα Χριςθσ Ζργων Σρίτων (εφόςον υπάρχει) μαηί με τουσ ςυνοδευόμενουσ υπερςυνδζςμουσ. 18/19
θμείωμα Χριςθσ Ζργων Σρίτων Οι διαφάνειεσ βαςίηονται ςτο βιβλίο «C++ How to Program, 8th Edition, Harvey M. Deitel, Paul J. Deitel, Prentice Hall.» 19/19