...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
BOOST_WARN_EXCEPTION(expression, exception_type, predicate); BOOST_CHECK_EXCEPTION(expression, exception_type, predicate); BOOST_REQUIRE_EXCEPTION(expression, exception_type, predicate);
As for BOOST_<level>_THROW
, these assertions validate
that expression
raises
an exception of the type specified by exception_type
or any of its child type, with additional checks on the exception instance.
expression
,
the instance of the exception is passed to predicate
for further validation.
BOOST_<level>_THROW
if expression
does not raise any exception, or an unrelated exception is raised.
predicate
should be a unary
function accepting an instance of exception_type
or any of its child, and that should return a boolean indicating a success
(true
) or a failure (false
).
Warning | |
---|---|
the assertion catches only the expected exceptions. |
Tip | |
---|---|
It is possible to test for complex expressions with the use of constructs
such as |
The example below checks that the exception carries the proper error code.
Code |
---|
#define BOOST_TEST_MODULE example #include <boost/test/included/unit_test.hpp> struct my_exception { explicit my_exception( int ec = 0 ) : m_error_code( ec ) {} int m_error_code; }; bool is_critical( my_exception const& ex ) { return ex.m_error_code < 0; } void some_func( int i ) { if( i>=0 ) throw my_exception( i ); } BOOST_AUTO_TEST_CASE( test_exception_predicate ) { BOOST_CHECK_EXCEPTION( some_func(0), my_exception, !is_critical ); BOOST_CHECK_EXCEPTION( some_func(1), my_exception, is_critical ); } |
Output |
---|
> example --log_level=success Running 1 test case... Entering test module "example" test:24: Entering test case "test_exception_predicate" test:26: info: check 'exception "my_exception" raised as expected: validation on the raised exception through predicate "!is_critical"' has passed test:27: error: in "test_exception_predicate": exception "my_exception" raised as expected: validation on the raised exception through predicate "is_critical" test:24: Leaving test case "test_exception_predicate"; testing time: 203us Leaving test module "example"; testing time: 271us *** 1 failure is detected in the test module "example" |
See also: