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); | |||||
| }()); | |||||
| } |