Catching an Exception
When we throw an exception, it is as if we are using the
throw operator and its associated operand to "call" a catch
block "passing" an argument. The type of the operand
must be an exact match with the type specified in the
associated catch block, except for the following three
cases:
   1)   the operand (or, actual argument) matches a constant
of the same type, a reference of that type, or a constant
reference of that type,
   2)   the operand is an array containing elements of some
type that matches a pointer to that type, or
   3)   the operand is a pointer that matches a pointer to
void.