+ All Categories
Home > Documents > Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception...

Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception...

Date post: 19-Aug-2020
Category:
Upload: others
View: 7 times
Download: 1 times
Share this document with a friend
52
Chapter 16 Exceptions and Templates Spring 2020 The Borough of Manhattan Community College
Transcript
Page 1: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Chapter 16

Exceptions and Templates

Spring 2020 The Borough of Manhattan

Community College

Page 2: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

16.1 Exceptions

• An exception is a value or an object that

indicates that an error has occurred

• When an exception occurs, the program must

either terminate or jump to special code for

handling the exception

• The special code for handling the exception is

called an exception handler

16-2

Page 3: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Error Testing (Not Exception) 1 of 2

• The following code segment will trap a division-

by-zero error before it occurs:

if (den == 0)

cout << "ERROR: Division by 0.";

else

quotient = num / den;

• But what if similar code is part of a function that

returns the quotient?

16-3

Page 4: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Error Testing (Not Exception) 2 of 2

double divide(double num, double den)

{

if (den == 0)

{

cout << "ERROR: Division by 0.";

return 0;

}

else

return num / den;

}

• The program that calls the function will not know when an error has occurred since 0 is a valid result of a division operation

16-4

Page 5: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Throwing an Exception

double divide(double num, double den)

{

if (den == 0)

throw string("ERROR: Division by 0.");

else

return num / den;

}

• The function simply throws a string object containing a descriptive error message

• When a throw statement is executed, control is passed to an exception handler

16-5

Page 6: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Exceptions – Key Words

• throw – followed by an argument, is used to signal an exception

• try – followed by a block { }, is used to invoke code that may throw an exception

• catch – followed by a block { }, is used to process exceptions thrown in a preceding try block. It takes a parameter that matches the type of exception thrown

16-6

Page 7: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Throwing an Exception

• Code that detects the exception must pass information to the exception handler

This is done using a throw statement:

throw string("Emergency!");

throw 12;

• In C++, information thrown by the throw statement may be an object or a value of any type

16-7

Page 8: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Catching an Exception 1 of 2

• Block of code that handles the exception is said to catch the exception and is called an exception handler

• An exception handler is written to catch exceptions of a given type: For example, the code

catch(string str)

{

cout << str;

}

can only catch exceptions that are string objects

16-8

Page 9: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Catching an Exception 2 of 2

Another example of a handler:

catch(int x) {

cout << "Error: " << x;

}

This can catch exceptions of type int

16-9

Page 10: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Connecting to the Handler

Every catch block is attached to a try block of code and is responsible for handling exceptions thrown from that block

try

{

// code that may throw an exception // goes here

}

catch(char e1)

{

// This code handles exceptions

// of type char that are thrown

// in the try block

}

16-10

Page 11: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Execution of Catch Blocks

• The catch block syntax is similar to a that of a

function

• A catch block has a formal parameter that is

initialized to the value of the thrown exception

before the block is executed

16-11

Page 12: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Exception Example

•An example of exception handling is code that

computes the square root of a number

• It throws an exception in the form of a string

object if the user enters a negative number

16-12

Page 13: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Example

int main( )

{

try

{

double x;

cout << "Enter a number: ";

cin >> x;

if (x < 0) throw string("Bad argument!");

cout << "Square root of " << x << " is " << sqrt(x);

}

catch(string str)

{

cout << str;

}

return 0;

}

16-13

Page 14: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Flow of Control

1. The computer encounters a throw statement in a try block

2. The computer evaluates the throw expression, and immediately exits the try block

3. The computer selects an attached catch block that matches the type of the thrown value, places the thrown value in the catch block’s formal parameter, and executes the catch block

16-14

Page 15: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Handling an Exception Example

16-15

Page 16: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Uncaught Exception

• An exception may be uncaught if

–there is no catch block with a data type that

matches the exception that was thrown, or

–it was not thrown from within a try block

• The program will terminate in either case

16-16

Page 17: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Throwing an Exception Class

• An exception class can be defined and thrown

• A catch block must be designed to catch an

object of the exception class

• The exception class object can pass data to the

exception handler via data members

16-17

Page 18: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Throwing an Exception Class

16-18

IntRange.h

Page 19: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Throwing an Exception Class

16-19

Page 20: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Handling Multiple Exceptions

Multiple catch blocks can be attached to the

same try block of code. The catch blocks

should handle exceptions of different types

try{...}

catch(int iEx){...}

catch(string strEx){...}

catch(double dEx){...}

16-20

Page 21: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Handling Multiple Exceptions

16-21

IntRange2.h

Page 22: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Handling Multiple Exceptions

16-22

Page 23: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Extracting Information from the Exception Class

16-23

IntRange3.h

Page 24: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Extracting Information from the Exception Class

16-24

Page 25: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Exception When Calling new

• If new cannot allocate memory, it automatically

throws an exception of type bad_alloc

• Must #include <new> to use bad_alloc

• You can invoke new from within a try block, then

use a catch block to detect that memory was not

allocated

16-25

Page 26: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Exception When Calling new

16-26

Page 27: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Where to Find an Exception Handler?

• The compiler looks for a suitable handler attached to an enclosing try block in the same function

• If there is no matching handler in the function, it terminates execution of the function, and continues the search for a handler starting at the point of the call in the calling function

• The computer will keep terminating function calls and tracing backwards along the call chain until it finds an enclosing try block with a matching handler, or until the exception propagates out of main (terminating the program). This process is called unwinding the call stack

16-27

Page 28: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Nested Exception Handling

try blocks can be nested in other try blocks

void main()

{

try

{

doSomething(); //function containing

} //a try block

catch(string s)

{

... //Code to handle exception

}

}

16-28

Page 29: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Rethrowing an Exception

• Sometimes an exception handler may need to do

some tasks, then pass the exception to a handler

in the calling environment

• The statement

throw;

with no parameters can be used within a catch

block to pass the exception to a handler in the

outer block

16-29

Page 30: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

16.2 Function Templates

• Function template: A pattern for creating

definitions of functions that differ only in the type

of data they manipulate. It is a generic function

• They can be better than overloaded functions,

since the code defining the algorithm of the

function is only written once

16-30

Page 31: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Function Template Example

Two functions that differ only in the type of the data they manipulate

void swap(int x, int y) { int temp = x; x = y; y = temp; } void swap(char x, char y) { char temp = x; x = y; y = temp; }

16-31

Page 32: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

A swap Template

The logic of both functions can be captured with

one template function definition

template <class T>

void swap(T x, T y)

{ T temp = x;

x = y;

y = temp;

}

16-32

Page 33: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Using a Template Function

• When a function defined by a template is called, the compiler creates the actual definition from the template by inferring the type of the parameters from the type of arguments in the call

int i = 1, j = 2;

swap(i,j);

• This code makes the compiler instantiate the template with type int in place of the type parameter T

16-33

Page 34: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

A square Template

Here is a function template for the square

function

template <class T>

T square(T number)

{

return number * number;

}

16-34

Page 35: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

A square Template

16-35

Page 36: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

A square Template

16-36

Page 37: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Using Operators in Function Templates

• The square template will work correctly as long as the type of the parameter passed to it supports the * operator

• In addition, the square template will work with any user-defined class type that overloads the operator *

• Errors will result if square is used with types that do not support the operator *

16-37

Page 38: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Using Operators in Function Templates

16-38

Page 39: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Function Templates with Multiple Types

16-39

• More than one generic type may be used in a function template

Page 40: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Overloading with Function Templates

16-40

• As with regular functions, function templates may be overloaded by having different parameter lists

Page 41: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Function Template Notes 1 of 2

• A function template is a pattern

• No actual code is generated until the function named in the template is called

• When passing a class object to a function template, ensure that all operators referred to in the template are defined or overloaded in the class definition

16-41

Page 42: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Function Template Notes 2 of 2

• All data types specified in template prefix must be used in template definition. Function calls must pass parameters for all data types specified in the template prefix

• Function templates can be overloaded

• A program might contain a regular (non-template) version of a function as well as a template version. As long as each has a different parameter list, they can coexist as overloaded functions

16-42

Page 43: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Where to Start When Defining Templates

• Templates are often appropriate for multiple

functions that perform the same task with

different parameter data types

• Develop the function using usual data types first,

then convert to a template:

–add the template prefix

–convert data type names in the function to

type parameters (i.e., T types) in the template

16-43

Page 44: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Function templates and C++ 11

• As of C++ 11, the key word typename may be

used instead of class in the template prefix

• Thus,

template <class T>

may be written as

template <typename T>

16-44

Page 45: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

16.3 Class Templates

• It is possible to define templates for classes. Such classes define abstract data types

• Class templates can be used whenever we need several classes that only differ in the types of some of their data members, or in the types of the parameters of their member functions

16-45

Page 46: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Class Template

Consider the following classes

1. Class used to join two integers by adding them: class Joiner { public: int combine(int x, int y) { return x + y; } };

2. Class used to join two strings by concatenating them: class Joiner { public: string combine(string x, string y) { return x + y; } };

16-46

Page 47: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Example class Template

A single class template can capture the logic of both classes: it is written with a template prefix that specifies the data type parameters:

template <class T>

class Joiner

{

public:

T combine(T x, T y)

{ return x + y; }

};

16-47

Page 48: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Using Class Templates

To create an object of a class defined by a

template, specify the actual parameters for the

formal data types

Joiner<double> jd;

Joiner<string> js;

cout << jd.combine(3.0, 5.0);

//Print 8.0

cout << js.combine("Hi ", "Joe");

//Print Hi Joe

16-48

Page 49: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Member Function Definitions Outside of a

Template Class

• If a member function is defined outside of the

class, then the definition requires the template

header to be prefixed to it, and the template

name and type parameter list to be used to refer

to the name of the class:

template <class T>

T Joiner<T>::combine(T x, T y)

{ return x + y; }

16-49

Page 50: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Using Class Templates - Example

16-50

Page 51: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

Using Class Templates - Example

16-51

Page 52: Exceptions and Templates...Catching an Exception 1 of 2 •Block of code that handles the exception is said to catch the exception and is called an exception handler •An exception

16.4 Class Templates and Inheritance

• Templates can be combined with inheritance

• You can derive a template class from a template

class

• Other combinations are possible:

–Derive a template from an ordinary class

–Derive an ordinary class from a template

16-52


Recommended