Presentation is loading. Please wait.

Presentation is loading. Please wait.

Chapter 17 Templates and Exceptions Part 2

Similar presentations


Presentation on theme: "Chapter 17 Templates and Exceptions Part 2"— Presentation transcript:

1 Chapter 17 Templates and Exceptions Part 2
Dale/Weems/Headington

2 An Exception is… An unusual, often unpredictable event, detectable by software or hardware, that requires special processing; also, in C++, a variable or class object that represents an exceptional event. An exception handler is a section of program code that is executed when a particular exception occurs.

3 The throw Statement Throw: to signal the fact that an exception has occurred; also called raise Throw Statement throw Expression

4 Throw examples (1) throw 5; string str = “Invalid customer age”;
class SalaryError { }; SalaryError sal; throw sal;

5 Throw examples (2) Use of anonymous (unnamed) object class SalaryError
{}; throw SalaryError(); A wrong way throw SalaryError;

6 The try-catch Statement
How one part of the program catches and processes the exception that another part of the program throws. TryCatchStatement try Block catch (FormalParameter) FormalParameter DataType [VariableName]

7 Example of a try-catch Statement
{ // Statements that process personnel data and may throw // exceptions of type int, string, and SalaryError } catch ( int ) // Statements to handle an int exception catch ( string s )

8 try-catch Continued // call all other types of exceptions
cout << s << endl; // Prints "Invalid customer age" // More statements to handle an age error } catch ( SalaryError ) { // Statements to handle a salary error catch (…) // call all other types of exceptions

9 Execution of try-catch
statement throws an exception No statements throw an exception Exception Handler Control moves directly to exception handler Statements to deal with exception are executed Statement following entire try-catch statement

10 Selecting an Exception Handler
The computer: matches data types of throw clause with the data types in the catch clauses Searches in a “north-to-south” order Selects first handler whose data type matches that of the thrown exception Ellipse parameters are a “wild card” and catch all. Place the “catch all” handler last.

11 Selecting an Exception Handler
What constitutes a match? Suppose an object of type T is thrown. A catch block that takes an argument of type C is a match if: T and C are the same type. C adds a reference qualifies (e.g. int can be caught by int&) C is a base class of publicly derived class T Note: matching process more restrictive than for function calls. Ex: int can’t be caught by float or char

12 More on Selecting Exception Handlers
The parameter’s name is needed only if statements in the body of the exception handler use that variable. It is a good idea to use only user-defined classes (and structs) as exception types, one type per exception descriptive identifiers

13 An example class SalaryError // Exception class {};
class BadRange // Exception class if ( condition ) throw SalaryError(); throw BadRange();

14 Nonlocal Exception Handlers
It is more common for the throw to occur inside a function that is called from within a try-clause than for the throw to be located within the try-catch statement

15 Throwing an Exception to be Caught by the Calling Code
void Func3() { try Func4(); } catch ( ErrType ) void Func4() { if ( error ) throw ErrType(); } Function call Normal return Return from thrown exception

16 Passing an Exception up the Chain of Function Calls
main Program terminates immediately main No ErrType handler No ErrType handler Call Immediate return Func1 Func1 Call ErrType handler No ErrType handler Call Call Func2 Func2 Immediate return No ErrType handler Immediate return No ErrType handler Call Call Immediate return Func3 Func3 Immediate return No ErrType handler No ErrType handler Call Call Func4 Func4 No ErrType handler throw ErrType(); No ErrType handler throw ErrType(); Immediate return Immediate return Function Func1 has a handler for ErrType No function has a handler for ErrType

17 Re-Throwing an Exception
The throw expression is optional. throw; Re-throwing an exception in C++ allows partial exception handling.

18 An example (1) void WriteToFile( parameters ) {
… // Open a file for output try while ( condition ) DoSomething( arguments ); // May throw a BadData exception … // Write to output file }

19 An example (2) catch ( BadData ) {
… // Write massage to output file and // close it throw; // Re-throw the exception } … // Continue processing // and close the output file

20 A Solution // quotient.cpp -- Quotient program
#include<iostream> #include <string> using namespace std; int Quotient( int, int ); class DivByZero // Exception class {}; int main() { int numer; // Numerator int denom; // Denominator

21 cout << "Enter numerator and denominator: ";
cin >> numer >> denom; while (cin) { try { cout << "Their quotient: " << Quotient(numer, denom) << endl; } catch ( DivByZero ) { cout << "*** Denominator can't be 0" << endl; } cin >> numer >> denom; } return 0; }

22 int Quotient( /* in */ int numer, // The numerator
/* in */ int denom ) // The denominator { if (denom == 0) throw DivByZero(); return numer / denom; }

23 Standard Exceptions Exceptions Thrown by the Language
new, dynamic_cast, typeid, exception specification Exceptions Thrown by Standard Library Routines Facilities inherited from the C language Facilities designed specifically for C++

24 Exception thrown by new
float* arr; try { arr = new float[50000]; } catch ( bad_alloc ) cout << “*** Out of memory. Can’t allocate array.” << endl; return 1; // return to calling function … // Continue. Allocation succeeded

25 Exceptions thrown by C++ libraries (1)
Exceptions thrown by string classes void SomeFunc( parameters ) { string s1, s2; try s2 = s1.substr(pos, len); // May throw out_of_range() s1 = s1 + s1 + s2; // May throw length_error() }

26 Exceptions thrown by C++ libraries (2)
Exceptions thrown by string classes catch ( out_of_range ) { cout << “Exception: out_of_range in SomeFunc” << endl; throw; // Re-throw exception to a caller } catch ( length_error ) cout << “Exception: length_error in SomeFunc” throw; // Re-throw exception to a caller … // Continue if no errors

27 Dividing by ZERO Apply what you know:
int Quotient( /* in */ int numer, // The numerator /* in */ int denom ) // The denominator { if (denom != 0) return numer / denom; else // What to do?? }

28 The end of Chapter 17 Part 2


Download ppt "Chapter 17 Templates and Exceptions Part 2"

Similar presentations


Ads by Google