When an exception is caught by a function-try-block handler in a constructor, any fully constructed base classes and class members of the object are destroyed prior to entering the handler [ISO/IEC 14882-2014]. Similarly, when an exception is caught by a function-try-block handler in a destructor, all base classes and nonvariant class members of the objects are destroyed prior to entering the handler. Because of this behavior, the C++ Standard, [except.handle], paragraph 10, states the following:
Referring to any non-static member or base class of an object in the handler for a function-try-block of a constructor or destructor for that object results in undefined behavior.
Do not reference base classes or class data members in a constructor or destructor function-try-block handler. Doing so results in undefined behavior.
Noncompliant Code Example
In this noncompliant code example, the constructor for class
C handles exceptions with a function-try-block. However, it generates undefined behavior by inspecting its member field
In this compliant solution, the handler inspects the constructor parameter rather than the class data member, thereby avoiding undefined behavior.
Accessing nonstatic data in a constructor's exception handler or a destructor's exception handler leads to undefined behavior.
|Axivion Bauhaus Suite|
|LDRA tool suite|
|CERT_CPP-ERR53-a||Handlers of a function-try-block implementation of a class constructor or destructor shall not reference nonstatic members from this class or its bases|
|Polyspace Bug Finder|
|CERT C++: ERR53-CPP||Checks for constructor or destructor function-try-block handler referencing base class or class data member (rule fully covered)|
Rule 15-3-3 (Required)
|[ISO/IEC 14882-2014]||Subclause 15.3, "Handling an Exception"|