一种干净的方法是使用转换函数和所有异常样板,它返回相应异常的退出值.
templateint call_and_translate_for_boundary(Callable&& func) try { func(); return 0; } catch(const Someclass1& e){ return 2; } catch(const Someclass2& e){ return 3; } //... catch(...){ return 1; }
在您自己的代码中,您只关心自己用lambda包装业务逻辑并将其传递给翻译函数,以便它可以为您捕获和翻译.
int main() { return call_and_translate_for_boundary([&]{ //business logic here }); }