When an exception is thrown, the exception handling mechanism searches for a matching handler for it. The matching rules for exceptions are more restrictive than the matching rules for function overloading. For example:
try{ throw int();}catch (unsigned int) //will not catch the exception from previous try-block{ }
The exception thrown is of type int, whereas the handler expects an unsigned int. The exception handling mechanism does not consider these to be matching types, and as a result, the thrown exception is not caught. The matching rules for exceptions allow only a limited set of conversions. For an exception E and a handler taking T or T&, the match is valid if T and E are of the same type (ignoring const and volatile specifiers), or if E is publicly derived from T. If E and T are pointers, the match is valid if E and T are of the same type or if E is a pointer to an object publicly derived from T.