C++如何实现仅终止调用函数而非全程序的类return检查辅助函数
方案1:使用宏实现(最推荐,兼容绝大多数场景,无额外依赖)
C++普通函数无法直接改变调用方的执行流,宏是最贴合你需求的实现方式,工业界项目中这类校验逻辑普遍采用宏实现:
// 定义CHECK宏,适配void返回值的函数 #define CHECK(pred, msg) \ do { \ if (!(pred)) { \ ERROR_LOG("%s", msg); \ return; \ } \ } while(0) // 针对非void返回值的函数,可定义带返回值的版本 #define CHECK_RET(pred, msg, ret) \ do { \ if (!(pred)) { \ ERROR_LOG("%s", msg); \ return ret; \ } \ } while(0)
使用方式和你期望的完全一致:
void foo(const std::string value){ // 前面的数百行逻辑 CHECK( !value.empty(), "Error, Value is empty" ); // 后面的数百行逻辑 }
说明:外层套
do{}while(0)是通用的宏写法,目的是避免宏在if/else等分支语句中展开时出现语法错误。
方案2:异常实现(仅适用于项目允许使用异常的场景)
如果你的项目没有禁用C++异常,可以在check函数中抛出自定义异常,上层调用foo的位置捕获异常即可:
static inline void check(bool pred, const std::string& message){ if(!pred){ ERROR_LOG("%s", message.c_str()); throw std::runtime_error(message); } } // foo函数不需要修改 void foo(const std::string value){ // 前面的数百行逻辑 check( !value.empty(), "Error, Value is empty" ); // 后面的数百行逻辑 } // 调用foo的位置需要捕获异常 void call_foo() { try { foo("test"); } catch (const std::exception& e) { // 处理错误,不需要终止整个程序 } }
方案3:返回错误码/Expected(适合需要透传错误的场景)
如果你的项目既禁用异常,又不想用宏,可以修改函数返回值透传错误状态,C++23可直接用std::expected,低版本可以用第三方实现或者自定义错误返回:
enum class ErrorCode { OK, EMPTY_VALUE }; std::expected<void, ErrorCode> foo(const std::string value){ // 前面的数百行逻辑 if (value.empty()) { ERROR_LOG("%s", "Error, Value is empty"); return std::unexpected(ErrorCode::EMPTY_VALUE); } // 后面的数百行逻辑 return {}; }
这种方案需要修改原有函数的返回值,改动量相对较大,适合需要逐层处理错误的场景。
内容的提问来源于stack exchange,提问作者earlybird
相关产品推荐
相关产品推荐

