没有编译时语法来通知只有在存在当前异常时才能调用函数。它只能在运行时检测,是否存在此类当前异常。
你可以使用高阶编程,而不是提供 lippincott function,提供一个包装器,它为给定的函数执行整个try-call-catch-lippincott:
lippincott
auto with_catch = [](auto&& f, auto&& c, auto&&... args) -> decltype(c()) { try { f(std::forward<decltype(args)>(args)...); return {}; } catch (...) { return c(); } }; auto with_lippincott = [](auto&& f, auto&&... args) { return with_catch( std::forward<decltype(f)>(f), lippincott, std::forward<decltype(args)>(args)... ); };
这不容易被滥用。用法示例:
foo_Result r3 = with_lippincott(Snafuscate, true);
没有办法告诉编译器只应从a调用特定函数 catch 处理程序。
catch
但是,你可以打电话 std::current_exception() 从Lippincott函数中确定当前是否正在处理异常。如果这返回一个 nullptr 然后没有活动的异常。然后,您可以通过触发断言和/或让函数返回(而不是使用throw)在运行时处理此问题。
std::current_exception()
nullptr