Presentation is loading. Please wait.

Presentation is loading. Please wait.

Exception Handling. C++ 2 Outline  Throwing and handling exceptions  Exceptions of different types  The new operator and the exceptions  Re-throwing.

Similar presentations


Presentation on theme: "Exception Handling. C++ 2 Outline  Throwing and handling exceptions  Exceptions of different types  The new operator and the exceptions  Re-throwing."— Presentation transcript:

1 Exception Handling

2 C++ 2 Outline  Throwing and handling exceptions  Exceptions of different types  The new operator and the exceptions  Re-throwing an exception

3 C++ 3 Throwing and Handling Exceptions  We throw an exception when we want to postpone the effect of an event (which is probably an error).  In order to accomplish this we use the throw statement.  After the throw keyword we have to give an expression (a constant or a variable or maybe an object).  Exception handling can be done using the try and catch blocks.

4 C++ 4 The try and catch Blocks  The try - catch construction: try compound-statement handler-sequence  The handler-sequence is composed of one or more handlers. Each handler has the form: catch(exception-declaration) compound-statement  The exception-declaration is similar to the formal parameters of functions.

5 C++ 5 Example  The MyVector class with exception handling in the Sum member function.

6 C++ 6 The Class Declaration class MyVector { private: int *elem; int dim; public: MyVector(int *e, int d); MyVector(const MyVector & v); ~MyVector(); void SquareVect(); MyVector Sum(MyVector & v); void Display(); };

7 C++ 7 The Copy Constructor MyVector::MyVector(const MyVector & v) { dim = v.dim; elem = new int[dim]; for(int i=0; i < dim; i++) elem[i] = v.elem[i]; }

8 C++ 8 The Sum Member Function MyVector MyVector::Sum(MyVector & v) { if (dim != v.dim) throw "Different size"; int* x = new int[dim];

9 C++ 9 The Sum Member Function for(int i = 0; i < dim; i++) x[i] = elem[i] + v.elem[i]; MyVector t(x, dim); delete [] x; return t; }

10 C++ 10 The main Function (VectX) int main() { int x[20]; int dimX; cout << "dimension of X = "; cin >> dimX; for(int i = 0; i < dimX; i++) x[i] = 2 * i + 1; MyVector VektX(x, dimX); cout << "the X vector : "; VektX.Display();

11 C++ 11 VectY int y[20]; int dimY; cout << "dimension of Y = "; cin >> dimY; for(int i = 0; i < dimY; i++) y[i] = 2 * i + 2; MyVector VektY(y, dimY); cout << "the Y vector : "; VektY.Display();

12 C++ 12 The try and catch Blocks try { cout << "sum of vectors: "; VektX.Sum(VektY).Display(); cout << "No error\n"; } catch(const char *s) { cout << "Error! " << s << endl; }

13 C++ 13 Output (the same size) dimension of X = 2 the X vector : 1 3 dimension of Y = 2 the Y vector : 2 4 sum of vectors: 3 7 No error

14 C++ 14 Output (different size) dimension of X = 2 the X vector : 1 3 dimension of Y = 3 the Y vector : 2 4 6 sum of vectors: Error! Different size

15 C++ 15 Exceptions of Different Types  We can have multiple catch blocks after a try block.  To catch everything use: catch (... ) compound-statement  The... is part of the syntax.  The order of the catch blocks is important!

16 C++ 16 Example #include using namespace std;

17 C++ 17 The Print_Nonzero Function template void Print_Nonzero(T x) { if ( x == static_cast (0) ) throw static_cast (0); cout << typeid(x).name() << " " << x << endl; }

18 C++ 18 The main Function int main() { srand( (unsigned)time( NULL ) ); //...

19 C++ 19 The try Block try { switch ( rand() % 5 ) { case 0: Print_Nonzero( static_cast ( rand() % 2 ) ); break; case 1: Print_Nonzero( static_cast ( rand() % 2 ) ); break;

20 C++ 20 The try Block case 2: Print_Nonzero( static_cast ( rand() % 2 ) ); break; default: Print_Nonzero( rand() % 2 ); break; }

21 C++ 21 Catch Blocks catch( int ) { cout << "Error: zero (int)\n"; } catch( long ) { cout << "Error: zero (long)\n"; } catch(... ) { cout << "Error: zero (floating point)\n"; }

22 C++ 22 The new Operator and the Exceptions  If there isn’t enough memory then  in older versions of C++ the new operator simply returned zero  at present (C++ standard) throws a std::bad_alloc exception, but if we don’t want to occur this, then we have to use the form new(std::nothrow).

23 C++ 23 Re-throwing an Exception  Use the throw; statement in the catch block.

24 C++ 24 Empty Class #include using namespace std; class DivisionByZero{}; // use it only // for handling exceptions

25 C++ 25 The f Function double f(double x) { if ( x == 0.0 ) throw DivisionByZero(); return 1.0 / x; }

26 C++ 26 The g Function double g(char *s, double x) { double y = 0.0; cout << s; try { y = f(x); }

27 C++ 27 The g Function catch( DivisionByZero ) { cout << "Error in g: "; //throw; } return y; }

28 C++ 28 The main function int main() { double number; cout << "The number = "; cin >> number; try { cout << g("The inverse: ", number) << endl; } catch( DivisionByZero ) { cout << "Division by zero.\n"; }

29 C++ 29 Output The number = 0 The inverse: Error in g: 0  But if we re-throw the exception (uncomment throw in function g), then: The number = 0 The inverse: Error in g: Division by zero.


Download ppt "Exception Handling. C++ 2 Outline  Throwing and handling exceptions  Exceptions of different types  The new operator and the exceptions  Re-throwing."

Similar presentations


Ads by Google