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/18 12:51] – [Τύποι παραγόμενων εξαιρέσεων] gthanos | cpp:exception [2018/05/18 13:45] – [Κληρονομικότητα] gthanos | ||
---|---|---|---|
Line 140: | Line 140: | ||
class MyException: | class MyException: | ||
- | | + | public: |
+ | | ||
return "Just another std:: | return "Just another std:: | ||
} | } | ||
- | } | + | }; |
int main() { | int main() { | ||
try { | try { | ||
- | | + | |
- | throw 2.5; | + | cout << "Enter option (1-5): "; |
- | throw " | + | |
- | | + | short int c; |
+ | MyException ex; | ||
+ | switch(option) { | ||
+ | case 1: | ||
+ | throw 10; // throw an int literal | ||
+ | break; | ||
+ | case 2: | ||
+ | | ||
+ | | ||
+ | case 3: | ||
+ | | ||
+ | break; | ||
+ | case 4: | ||
+ | throw string(" | ||
+ | break; | ||
+ | case 5: | ||
+ | | ||
+ | break; | ||
+ | default: | ||
+ | c = -10; throw c; // throw a character (default option) | ||
+ | break; | ||
+ | } | ||
} catch(int ex) { | } catch(int ex) { | ||
- | cout << "Got '<< | + | cout << "Got '"<< ex <<"' |
} catch(double ex) { | } catch(double ex) { | ||
- | cout << "Got '<< | + | cout << "Got '"<< ex <<"' |
} catch(const char *ex) { | } catch(const char *ex) { | ||
- | cout << "Got '<< | + | cout << " |
} catch(const string &ex) { | } catch(const string &ex) { | ||
- | cout << "Got '<< | + | cout << " |
} catch(const MyException &ex) { | } catch(const MyException &ex) { | ||
- | cout << "Got '<< | + | cout << "Got '"<< ex.what() <<"' |
- | } | + | } catch(...) { |
+ | cout << "Got an exception of unknown type!\n"; | ||
+ | } | ||
+ | cout << " | ||
} | } | ||
</ | </ | ||
+ | <WRAP tip 80% center round> | ||
+ | Στον παραπάνω κώδικα μπορείτε να παρατηρήσετε τα διαφορετικά μηνύματα που παράγονται ανάλογα με τον τύπο της εξαίρεσης. Παρατηρήστε επίσης ότι αν και παράγεται ένα αντικείμενο τύπου //short int//, το οποίο χωράει σε ένα //int// δεν γίνεται κάποια αυτόματη μετατροπή τύπου, ώστε το //catch block// που πιάνει τύπους //int// να πιάσει και αντικείμενα τύπου short int. | ||
+ | </ | ||
+ | |||
+ | ===== Κληρονομικότητα ===== | ||
+ | |||
+ | Ας υποθέσουμε ότι έχουμε τη σχέση κληρονομικότητας μεταξύ των κλάσεων **IDException** και **CountedIDException**, | ||
+ | |||
+ | <code cpp BaseException.h> | ||
+ | class BaseException: | ||
+ | protected: | ||
+ | int a; | ||
+ | public: | ||
+ | BaseException(int a) { this->a = a; } | ||
+ | const char* what() const throw() { | ||
+ | char s[64]; | ||
+ | sprintf(s, " | ||
+ | return s; | ||
+ | } | ||
+ | }; | ||
+ | </ | ||
+ | |||
+ | <code cpp DerivedException.h> | ||
+ | #include " | ||
+ | class DerivedException: | ||
+ | int b; | ||
+ | public: | ||
+ | DerivedException(int a, int b): Base(a) { this->b = b; } | ||
+ | const char* what() const throw() { | ||
+ | char s[64]; | ||
+ | sprintf(s, " | ||
+ | return s; | ||
+ | } | ||
+ | }; | ||
+ | </ | ||
+ | |||
+ | <code cpp ExceptionUse.cpp> | ||
+ | #include < | ||
+ | using namespace std; | ||
+ | |||
+ | int main() { | ||
+ | try { | ||
+ | } catch(BaseException ex) { | ||
+ | cout << ex.what(); | ||
+ | } catch(DerivedException ex) { | ||
+ | cout << ex.what(); | ||
+ | } | ||
+ | return 0; | ||
+ | } | ||
+ | </ | ||
cpp/exception.txt · Last modified: 2023/05/15 14:01 by gthanos