cpp:exception
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision | ||
cpp:exception [2018/05/19 04:00] – [Stack Unwinding] gthanos | cpp:exception [2018/05/20 14:26] – [Δήλωση των εξαιρέσεων που παράγουν οι συναρτήσεις (exception specifiers)] gthanos | ||
---|---|---|---|
Line 133: | Line 133: | ||
===== Δημιουργία και διαχείριση της εξαίρεσης ===== | ===== Δημιουργία και διαχείριση της εξαίρεσης ===== | ||
- | Όπως σε όλες τις γλώσσες αντικειμενοστραφούς προγραμματισμού η παραγωγή μιας εξαίρεσης θα πρέπει να γίνει μέσα σε ένα //try block// και η διαχείριση της μέσα σε ένα //catch block// που ακολουθεί το //try block//. Δείτε το παρακάτω ενδεικτικό παράδειγμα. | + | Όπως σε όλες τις γλώσσες αντικειμενοστραφούς προγραμματισμού η παραγωγή μιας εξαίρεσης θα πρέπει να γίνει μέσα σε ένα //try block// και η διαχείριση της μέσα σε ένα //catch block// που ακολουθεί το //try block//. Δείτε το παρακάτω ενδεικτικό παράδειγμα, όπου ανάλογα με την είσοδο που βάζει ο χρήστης παράγεται διαφορετικού τύπου // |
<code cpp ExceptionHandling.cpp> | <code cpp ExceptionHandling.cpp> | ||
Line 183: | Line 183: | ||
} catch(const MyException &ex) { | } catch(const MyException &ex) { | ||
cout << "Got '"<< | cout << "Got '"<< | ||
- | } catch(...) { | + | } catch(...) { // catch any exception not caught above! |
cout << "Got an exception of unknown type!\n"; | cout << "Got an exception of unknown type!\n"; | ||
} | } | ||
Line 189: | Line 189: | ||
} | } | ||
</ | </ | ||
+ | |||
+ | <WRAP info 80% center round> | ||
+ | Στον παραπάνω κώδικα το //catch block// | ||
+ | <code cpp> | ||
+ | } catch(...) { // catch any exception not caught above! | ||
+ | cout << "Got an exception of unknown type!\n"; | ||
+ | } | ||
+ | </ | ||
+ | πιάνει όλους τους τύπους // | ||
+ | </ | ||
<WRAP tip 80% center round> | <WRAP tip 80% center round> | ||
Line 196: | Line 206: | ||
===== Κληρονομικότητα ===== | ===== Κληρονομικότητα ===== | ||
- | Ας υποθέσουμε ότι έχουμε τη σχέση κληρονομικότητας μεταξύ των κλάσεων **IDException** και **CountedIDException**, όπως παρακάτω: | + | Ας υποθέσουμε ότι έχουμε τη σχέση κληρονομικότητας μεταξύ των κλάσεων **BaseException** και **DerivedException**, όπως παρακάτω: |
<code cpp BaseException.h> | <code cpp BaseException.h> | ||
Line 331: | Line 341: | ||
</ | </ | ||
+ | <WRAP tip 80% center round> | ||
+ | Είναι προφανές ότι η σειρά των //catch blocks// θα έπρεπε να είναι η αντίστροφη (πρώτα το //catch block// για την αναφορά τύπου // | ||
+ | </ | ||
===== Stack Unwinding ===== | ===== Stack Unwinding ===== | ||
Line 399: | Line 412: | ||
</ | </ | ||
- | H εξέλιξη του //program stack// στο παρακάτω πρόγραμμα δίνεται στο παρακάτω διάγραμμα. Παρατηρήστε ότι το exception παράγεται στη συνάρτηση **FFFF()**, αλλά πιάνεται στην **F()** πράγμα που συνεπάγεται την αυτόματη συρρίκνωση του //stack// στο επίπεδο της συνάρτησης **F()**. | + | H εξέλιξη του //program stack// στο παρακάτω πρόγραμμα δίνεται στο παρακάτω διάγραμμα. Παρατηρήστε ότι το exception παράγεται στη συνάρτηση **FFFF()**, αλλά |
{{ : | {{ : | ||
+ | |||
+ | ===== Κλείσιμο ανοιχτών resources όταν συμβεί ένα exception ===== | ||
+ | |||
+ | 1. Διάβασμα από αρχείο και δέσμευση διδιάστατου πίνακα. | ||
+ | |||
+ | ===== Δήλωση των εξαιρέσεων που παράγουν οι συναρτήσεις (exception specifiers) ===== | ||
+ | |||
+ | Κατά τη δήλωση μίας συνάρτησης είναι δυνατόν να ορίσετε εάν αυτή μπορεί να παράγει κάποιου είδους // | ||
+ | - '' | ||
+ | - '' | ||
+ | - '' | ||
+ | |||
+ | Τους παραπάνω ορισμούς είναι δυνατόν να τους συναντήσετε στις // | ||
+ | |||
+ | ===== Function try blocks ===== | ||
+ | |||
+ | ===== Η κλάση std:: | ||
+ | |||
+ | |||
+ | |||
+ | |||
cpp/exception.txt · Last modified: 2023/05/15 14:01 by gthanos