The C++ Standard, [except.handle], paragraph 4 [ISO/IEC 14882-2014], states the following:
The handlers for a try block are tried in order of appearance. That makes it possible to write handlers that can never be executed, for example by placing a handler for a derived class after a handler for a corresponding base class.
Consequently, if two handlers catch exceptions that are derived from the same base class (such as
std::exception), the most derived exception must come first.
Noncompliant Code Example
In this noncompliant code example, the first handler catches all exceptions of class
B, as well as exceptions of class
D, since they are also of class
B. Consequently, the second handler does not catch any exceptions.
In this compliant solution, the first handler catches all exceptions of class
D, and the second handler catches all the other exceptions of class
Exception handlers with inverted priorities cause unexpected control flow when an exception of the derived type occurs.
|Axivion Bauhaus Suite|
|LDRA tool suite|
541 S, 556 S
Where multiple handlers are provided in a single try-catch statement or function-try-block for a derived class and some or all of its bases, the handlers shall be ordered most-derived to base class
|Polyspace Bug Finder|
|CERT C++: ERR54-CPP|
Rule fully covered.
|SonarQube C/C++ Plugin|
Rule 15-3-6 (Required)
|[ISO/IEC 14882-2014]||Subclause 15.3, "Handling an Exception"|