Exceptions handlers (catch ()
) are evaluated in the order they are written. Once a match is found, the evaluation stops. If there is a
handler for a base class followed by a handler for class derived from that base class, the second handler will never trigger: The handler for the base
class will match the derived class, and will be the only executed handler. The derived class handler is dead code.
Noncompliant code example
class BaseException { };
class DerivedException: public BaseException { };
try
{
// ...
}
catch ( BaseException &b ) // Will catch DerivedException as well
{
// ...
}
catch ( DerivedException &d ) // Noncompliant, the previous handled effectively hides this one
{
// Any code here will be unreachable,
}
Compliant solution
class BaseException { };
class DerivedException: public BaseException { };
try
{
// ...
}
catch ( DerivedException &d ) // Compliant
{
// ...
}
catch ( BaseException &b ) // Compliant, will be triggered for BaseException that are not DerivedException
{
// ...
}