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 11:47] gthanoscpp:exception [2018/05/18 13:45] – [Κληρονομικότητα] gthanos
Line 4: Line 4:
  
 <code cpp Vector.cpp> <code cpp Vector.cpp>
 +#include <iostream>
 +#include <cstdlib>
 +
 +using namespace std;
 +
 class Vector { class Vector {
   int *array;   int *array;
Line 41: Line 46:
  
 <code cpp VectorUse.cpp> <code cpp VectorUse.cpp>
 +#include "Vector.cpp"
 +
 int main() { int main() {
   int size;   int size;
Line 54: Line 61:
  
 <code cpp Vector.cpp> <code cpp Vector.cpp>
 +#include <iostream>
 +#include <cstdlib>
 +
 +using namespace std;
 +
 class Vector { class Vector {
   int *array;   int *array;
Line 76: Line 88:
  
 int &Vector::valueAt(int pos) const { int &Vector::valueAt(int pos) const {
-  if(pos>=length()) {+  if(pos>=size) {
      cerr << "Invalid access position!\n";      cerr << "Invalid access position!\n";
      return array[size-1];      return array[size-1];
Line 85: Line 97:
  
 <code cpp VectorUse.cpp> <code cpp VectorUse.cpp>
 +#include "Vector.cpp"
 +
 int main() { int main() {
   int size;   int size;
Line 101: Line 115:
 } }
 </code> </code>
 +
 +<WRAP tip 80% center round>
 +Αν και στο παραπάνω απλό παράδειγμα είναι προφανές ότι είναι πιο απλό να ελέγξει κανείς το μέγεθος της παραμέτρου size πριν καλέσει τον κατασκευαστή, κάτι τέτοιο είναι δύσκολο να εφαρμοστεί σε όλες τις περιπτώσεις, όπως για παράδειγμα το μέγεθος **size** παράγεται δυναμικά από το πρόγραμμα και ο κατασκευαστής καλείται σε αρκετά διαφορετικά σημεία του προγράμματος.
 +</WRAP>
 +===== Τύποι παραγόμενων εξαιρέσεων =====
 +
 +Στη C++ μπορείτε να δημιουργήσετε ένα Exception χρησιμοποιώντας οποιονδήποτε τύπο δεδομένων, δηλαδή δεν απαιτείται τα αντικείμενα που παράγονται να είναι απόγονοι συγκεκριμένης κλάσης. Δείτε μερικά παραδείγματα παραγωγής έγκυρων //exceptions// παρακάτω:
 +
 +<code cpp>
 +throw -1;                     // throw an integer value
 +throw ENUM_INVALID_INDEX;     // throw an enum value
 +throw "Invalid argument!";    // throw a literal C-style (const char*) string
 +double pi=3.14159; throw pi;  // throw a double variable that was previously defined
 +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 DerivedException.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 ExceptionUse.cpp>
 +#include <iostream>
 +using namespace std;
 +
 +int main() {
 +  try {
 +  } catch(BaseException ex) {
 +    cout << ex.what();
 +  } catch(DerivedException ex) {
 +    cout << ex.what();
 +  }
 +  return 0;
 +}
 +</code>
 +
 +
  
cpp/exception.txt · Last modified: 2023/05/15 14:01 by gthanos