exceptions thrown by the deleter (#28), furthermore it's noexcept now.main
other.release(); | other.release(); | ||||
} | } | ||||
~scope_exit() | |||||
~scope_exit() noexcept(true) | |||||
{ | { | ||||
if( m_execute_on_destruction == true ) | if( m_execute_on_destruction == true ) | ||||
{ | { | ||||
call_deleter_safe(); | |||||
m_deleter(); | |||||
} | } | ||||
} | } | ||||
private: | private: | ||||
void call_deleter_safe() noexcept | |||||
{ | |||||
try | |||||
{ | |||||
m_deleter(); | |||||
} | |||||
catch( ... ) { /* Empty */ } | |||||
} | |||||
Deleter m_deleter; | Deleter m_deleter; | ||||
bool m_execute_on_destruction; | bool m_execute_on_destruction; | ||||
}; | }; |
static_cast<void>(guard); | static_cast<void>(guard); | ||||
} | } | ||||
TEST_CASE("no exception propagation from deleter", "[ScopeExit]") | |||||
{ | |||||
REQUIRE_NOTHROW([] { | |||||
auto guard = sr::make_scope_exit([] { throw std::exception{}; }); | |||||
static_cast<void>(guard); | |||||
}()); | |||||
} |