User Tools

Site Tools


cpp:exception

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Next revisionBoth sides next revision
cpp:exception [2018/05/18 12:33] – [Διαχείριση Εξαιρέσεων] gthanoscpp:exception [2018/05/18 13:43] – [Δημιουργία και διαχείριση της εξαίρεσης] gthanos
Line 129: Line 129:
 double pi=3.14159; throw pi;  // throw a double variable that was previously defined double pi=3.14159; throw pi;  // throw a double variable that was previously defined
 throw MyException("Fatal!");  // Throw an object of class MyException throw MyException("Fatal!");  // Throw an object of class MyException
 +</code>
 +
 +===== Δημιουργία και διαχείριση της εξαίρεσης =====
 +
 +Όπως σε όλες τις γλώσσες αντικειμενοστραφούς προγραμματισμού η παραγωγή μιας εξαίρεσης θα πρέπει να γίνει μέσα σε ένα //try block// και η διαχείριση της μέσα σε ένα //catch block// που ακολουθεί το //try block//. Δείτε το παρακάτω ενδεικτικό παράδειγμα.
 +
 +<code cpp ExceptionHandling.cpp>
 +#include <iostream>
 +using namespace std;
 +
 +class MyException: public std::exception {
 +public:
 +  const char* what() const throw() {
 +    return "Just another std::exception";
 +  }
 +};
 +
 +int main() {
 +  try {
 +    int option;
 +    cout << "Enter option (1-5): ";
 +    cin >> option;
 +    short int c;
 +    MyException ex;
 +    switch(option) {
 +      case 1:
 +        throw 10;  // throw an int literal
 +        break;
 +      case 2:
 +        throw 2.5;  //throw a double literal
 +        break;
 +      case 3:
 +        throw "C++"; //throw a char * literal
 +        break;
 +      case 4:
 +        throw string("C++"); //throw a string
 +        break;
 +      case 5:
 +        throw ex; //throw a MyException object
 +        break;
 +      default:
 +        c = -10; throw c;  // throw a character (default option)
 +        break;
 +    }
 +  } catch(int ex) {
 +    cout << "Got '"<< ex <<"'!\n";
 +  } catch(double ex) {
 +    cout << "Got '"<< ex <<"'!\n";
 +  } catch(const char *ex) {
 +    cout << "Got char* '"<< ex <<"'!\n";
 +  } catch(const string &ex) {
 +    cout << "Got string '"<< ex <<"'!\n";
 +  } catch(const MyException &ex) {
 +    cout << "Got '"<< ex.what() <<"'!\n";
 +  } catch(...) {
 +    cout << "Got an exception of unknown type!\n";
 +  }
 +  cout << "Successfully handled the created exception!\n";
 +}
 +</code>
 +
 +<WRAP tip 80% center round>
 +Στον παραπάνω κώδικα μπορείτε να παρατηρήσετε τα διαφορετικά μηνύματα που παράγονται ανάλογα με τον τύπο της εξαίρεσης. Παρατηρήστε επίσης ότι αν και παράγεται ένα αντικείμενο τύπου //short int//, το οποίο χωράει σε ένα //int// δεν γίνεται κάποια αυτόματη μετατροπή τύπου, ώστε το //catch block// που πιάνει τύπους //int// να πιάσει και αντικείμενα τύπου short int.
 +</WRAP>
 +
 +===== Κληρονομικότητα =====
 +
 +Ας υποθέσουμε ότι έχουμε τη σχέση κληρονομικότητας μεταξύ των κλάσεων **IDException** και **CountedIDException**, όπως παρακάτω:
 +
 +<code cpp BaseException.h>
 +class BaseException: public std::exception {
 +protected:
 +  int a;
 +public:
 +  BaseException(int a) { this->a = a; }
 +  const char* what() const throw() {
 +    char s[64];
 +    sprintf(s, "BaseException, a: %d", a);
 +    return s;
 +  }
 +};
 +</code>
 +
 +<code cpp CountedIDException.h>
 +#include "BaseException.h"
 +class DerivedException: public BaseException {
 +  int b;
 +public:
 +  DerivedException(int a, int b): Base(a) { this->b = b; }
 +  const char* what() const throw() {
 +    char s[64];
 +    sprintf(s, "DerivedException, a: %d, b: %d", a, b);
 +    return s;
 +  }
 +};
 +</code>
 +
 +<code cpp IDExceptionUse.cpp>
 +#include <iostream>
 +using namespace std;
 +
 +int main() {
 +  try {
 +  } catch(BaseException ex) {
 +    cout << ex.what();
 +  } catch(DerivedException ex) {
 +    cout << ex.what();
 +  }
 +  return 0;
 +}
 </code> </code>
  
  
  
cpp/exception.txt · Last modified: 2023/05/15 14:01 by gthanos