Presentation is loading. Please wait.

Presentation is loading. Please wait.

1 Chapter 17-2 Templates and Exceptions Dale/Weems.

Similar presentations


Presentation on theme: "1 Chapter 17-2 Templates and Exceptions Dale/Weems."— Presentation transcript:

1 1 Chapter 17-2 Templates and Exceptions Dale/Weems

2 2 An Exception is… 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 3 The throw Statement Throw: to signal the fact that an exception has occurred; also called raise ThrowStatement throw Expression

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

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

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

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

8 8 try-catch Continued catch (string s) { cout << s << endl; // Prints "Invalid customer age" // More statements to handle an age error } catch (SalaryError) { // Statements to handle a salary error }

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

10 10 Selecting an Exception Handler The computer Examines data types of the formal parameters in exception handlers Searches in a “north-to-south” order Selects first formal parameter 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 11 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

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

13 13 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

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

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

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

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

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

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

20 20 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;// Terminate the program } …// Continue. Allocation succeeded

21 21 C library routine set errno l Simulate throwing exceptions from C library routines class CLibErr// Our own exception class {}; … void SomeFunc( parameters ) { … errno = 0; C_lib_routine( arguments ); if (errno != 0) throw CLibErr(); … }

22 22 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() … }

23 23 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” << endl; throw; // Re-throw exception to a caller } …// Continue if no errors }

24 24 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?? }

25 25 A Solution // “quotient.cpp” -- Quotient program #include #include using namespace std; int Quotient(int, int); class DivByZero // Exception class {}; int main() { int numer; // Numerator int denom; // Denominator cout << "Enter numerator and denominator: ";

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

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

28 28 Appointment Calendar l Replace array-based list with linked list to demonstrate that changing implementation doesn’t change client code l Add exceptions to Appointment Calendar Program

29 29 The End of Chapter 17 Part 2


Download ppt "1 Chapter 17-2 Templates and Exceptions Dale/Weems."

Similar presentations


Ads by Google