List various exceptional conditions that have occurred throughout this text. List as many additional exceptional conditions as you can. For each of these exceptions, describe briefly how a program typically would handle the exception, using the exception-handling techniques discussed in this chapter. Some typical exceptions are division by zero, arithmetic overflow, array subscript out of bounds, exhaustion of the free store, etc.
Under what circumstances would the programmer not provide a parameter name when defining the type of the object that will be caught by a handler?
A program contains the statement
Where would you normally expect to find such a statement? What if that statement appeared in a different part of the program?
Compare and contrast exception handling with the various other error-processing schemes discussed in the text.
Why should exceptions not be used as an alternate form of program control?
Describe a technique for handling related exceptions.
Until this chapter, we have found that dealing with errors detected by constructors can be awkward. Exception handling gives us a better means of handling such errors. Consider a constructor for a String class. The constructor uses new to obtain space from the free store. Suppose new fails. Show how you would deal with this without exception handling. Discuss the key issues. Show how you would deal with such memory exhaustion with exception handling. Explain why the exception-handling approach is superior.
Suppose a program tHRows an exception and the appropriate exception handler begins executing. Now suppose that the exception handler itself throws the same exception. Does this create infinite recursion? Write a program to check your observation.
Use inheritance to create various derived classes of runtime_error. Then show that a catch handler specifying the base class can catch derived-class exceptions.
Write a conditional expression that returns either a double or an int. Provide an int catch handler and a double catch handler. Show that only the double catch handler executes, regardless of whether the int or the double is returned.
Write a program that generates and handles a memory-exhaustion exception. Your program should loop on a request to create dynamic memory through operator new.
Write a program illustrating that all destructors for objects constructed in a block are called before an exception is thrown from that block.
Write a program illustrating that member object destructors are called for only those member objects that were constructed before an exception occurred.
Write a program that demonstrates several exception types being caught with the catch(...) exception handler.
Write a program illustrating that the order of exception handlers is important. The first matching handler is the one that executes. Attempt to compile and run your program two different ways to show that two different handlers execute with two different effects.
Write a program that shows a constructor passing information about constructor failure to an exception handler after a try block.
Write a program that illustrates rethrowing an exception.
Write a program that illustrates that a function with its own try block does not have to catch every possible error generated within the TRy. Some exceptions can slip through to, and be handled in, outer scopes.
Write a program that throws an exception from a deeply nested function and still has the catch handler following the TRy block enclosing the call chain catch the exception.