Exception Handling. C++ 2 Outline Throwing and handling exceptions Exceptions of different types ...

Post on 05-Jan-2016

233 views 0 download

Transcript of Exception Handling. C++ 2 Outline Throwing and handling exceptions Exceptions of different types ...

Exception Handling

C++ 2

Outline

Throwing and handling exceptions Exceptions of different types The new operator and the exceptions Re-throwing an exception

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.

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.

C++ 5

Example

The MyVector class with exception handling in the Sum member function.

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();

};

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];}

C++ 8

The Sum Member Function

MyVector MyVector::Sum(MyVector & v)

{if (dim != v.dim)

throw "Different size";int* x = new int[dim];

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;

}

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();

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();

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;}

}

C++ 13

Output (the same size)

dimension of X = 2the X vector : 1 3dimension of Y = 2the Y vector : 2 4sum of vectors: 3 7No error

C++ 14

Output (different size)

dimension of X = 2the X vector : 1 3dimension of Y = 3the Y vector : 2 4 6sum of vectors: Error! Different size

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!

C++ 16

Example

#include <iostream>#include <stdlib.h>#include <time.h>using namespace std;

C++ 17

The Print_Nonzero Function

template <class T>void Print_Nonzero(T x) {

if ( x == static_cast<T>(0) )throw static_cast<T>(0);

cout << typeid(x).name() << " " << x << endl;

}

C++ 18

The main Function

int main() {

srand( (unsigned)time( NULL ) );// ...

C++ 19

The try Block

try {switch ( rand() % 5 ) { case 0:

Print_Nonzero( static_cast<long>( rand() % 2 ) ); break;

case 1: Print_Nonzero( static_cast<float>( rand() % 2 ) ); break;

C++ 20

The try Block

case 2: Print_Nonzero( static_cast<double>( rand() % 2 ) ); break;

default: Print_Nonzero( rand() % 2 ); break;

}}

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";}

}

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).

C++ 23

Re-throwing an Exception

Use the throw;

statement in the catch block.

C++ 24

Empty Class

#include <iostream>using namespace std;

class DivisionByZero{}; // use it only

// for handling exceptions

C++ 25

The f Function

double f(double x) {if ( x == 0.0 )

throw DivisionByZero();return 1.0 / x;

}

C++ 26

The g Function

double g(char *s, double x) {double y = 0.0;cout << s;try

{ y = f(x);

}

C++ 27

The g Function

catch( DivisionByZero ) {

cout << "Error in g: ";//throw;

}return y;

}

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";}

}

C++ 29

Output

The number = 0The inverse: Error in g: 0 But if we re-throw the exception

(uncomment throw in function g), then:

The number = 0The inverse: Error in g: Division by zero.