Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision |
cpp:exception [2019/05/06 07:21] – gthanos | cpp:exception [2019/05/06 07:56] – [Δημιουργία και διαχείριση της εξαίρεσης] gthanos |
---|
cout << "Enter option (1-5): "; | cout << "Enter option (1-5): "; |
cin >> option; | cin >> option; |
short int c; | char c; |
MyException ex; | MyException ex; |
switch(option) { | switch(option) { |
break; | break; |
default: | default: |
c = -10; throw c; // throw a character | c = -10; |
| throw c; // throw a character |
break; | break; |
} | } |
} | } |
</code> | </code> |
πιάνει όλους τους τύπους //exception// που δεν πιάστηκαν στα προηγούμενα //catch blocks//. Τοποθετώντας ένα //catch block// αυτής της μορφής είναι δυνατόν να εφαρμόσετε ένα τελικό έλεγχο για τύπους εξαιρέσεων που δεν έχετε προβλέψει ότι μπορούν να παραχθούν παραπάνω στον κώδικα σας. | πιάνει όλους τους τύπους //exception// που δεν πιάστηκαν στα προηγούμενα //catch blocks//. Τοποθετώντας ένα //catch block// αυτής της μορφής είναι δυνατόν να εφαρμόσετε ένα τελικό έλεγχο για τύπους εξαιρέσεων που δεν έχετε προβλέψει ότι μπορούν να παραχθούν από τον κώδικα σας. |
</WRAP> | </WRAP> |
| |
<WRAP tip 80% center round> | <WRAP tip 80% center round> |
Στον παραπάνω κώδικα μπορείτε να παρατηρήσετε τα διαφορετικά μηνύματα που παράγονται ανάλογα με τον τύπο της εξαίρεσης. Παρατηρήστε επίσης ότι αν και παράγεται ένα αντικείμενο τύπου //short int//, το οποίο χωράει σε ένα //int// δεν γίνεται κάποια αυτόματη μετατροπή τύπου, ώστε το //catch block// που πιάνει τύπους //int// να πιάσει και αντικείμενα τύπου short int. | Στον παραπάνω κώδικα μπορείτε να παρατηρήσετε τα διαφορετικά μηνύματα που παράγονται ανάλογα με τον τύπο της εξαίρεσης. Παρατηρήστε, ότι αν και παράγεται ένα αντικείμενο τύπου //char//, το οποίο χωράει σε ένα //int// δεν γίνεται κάποια αυτόματη μετατροπή τύπου, ώστε το //catch block// που πιάνει τύπους //int// να πιάσει και αντικείμενα τύπου //char//. |
</WRAP> | </WRAP> |
| |
| <WRAP tip 80% center round> |
===== Δήλωση των εξαιρέσεων που παράγουν οι συναρτήσεις (exception specifiers) ===== | Στον παραπάνω κώδικα παρατηρήστε ότι για τα αντικείμενα τύπου //std::string// και //MyException// διαχειριζόμαστε μία αναφορά στον παραγόμενο αντικείμενο και όχι το αντικείμενο το ίδιο. Ο λόγος είναι κατά τη διαχείριση, αντιγράφεται στο //catch block// μόνο η αναφορά (δείκτης προς το αντικείμενο) και όχι το σύνολο του αντικειμένου. |
| </WRAP> |
Κατά τη δήλωση μίας συνάρτησης είναι δυνατόν να ορίσετε εάν αυτή μπορεί να παράγει κάποιου είδους //exception//. Υπάρχουν 3 διαφορετικού τύποι ορισμών οι οποίοι δίνονται παρακάτω: | |
- ''int functionName() throw()'': Ο συγκεκριμένος ορισμός δηλώνει ότι δεν παράγεται καμία εξαίρεση. | |
- ''int functionName() throw(std::bad_alloc)'': Ο συγκεκριμένος ορισμός δηλώνει ότι μπορεί να παραχθεί μία εξαίρεση τύπου [[http://en.cppreference.com/w/cpp/memory/new/bad_alloc|std::bad_alloc]]. | |
- ''int functionName() throw(...)'': Ο συγκεκριμένος ορισμός δηλώνει ότι μπορεί να παραχθεί οποιουδήποτε τύπου εξαίρεση. | |
| |
Τους παραπάνω ορισμούς είναι δυνατόν να τους συναντήσετε στις //standard// βιβλιοθήκες της C++. Δεν είναι όμως ευρέως χρησιμοποιούμενοι και η υποστήριξη τους από τους C++ //compilers// είναι συχνά ελλειπής. Δεν συνιστάται η χρήση τους σε κώδικα που γράφετε εσείς, λόγω της ελλειπούς υποστήριξης από την κοινότητα της C++. | |
| |
/* | |
===== Function try blocks ===== | |
*/ | |
| |
| |
| |
| |
| |
| |
| |