如何复用C++函数的统一错误检查包装逻辑?
统一封装C++函数的错误检查逻辑
完全可以实现统一封装,不用重复复制粘贴错误处理代码,核心思路是用模板函数包裹通用的错误检查与异常处理逻辑,适配不同的返回类型和参数列表。
实现通用错误封装模板
把重复的前置检查、异常捕获逻辑写成一个模板函数,利用C++模板推导和完美转发适配任意返回类型与参数:
#include <utility> // 用于std::forward template<typename Func, typename... Args> auto errorCheck(Func&& func, Args&&... args) -> decltype(std::forward<Func>(func)(std::forward<Args>(args)...)) { // 统一前置检查 if (_api == nullptr) { throw exceptionNotConnected(); } try { // 执行传入的核心业务逻辑 return std::forward<Func>(func)(std::forward<Args>(args)...); } catch (DigiByteException& e) { // 统一处理DigiByteException if (e.getMessage() != "Failed to authenticate successfully") { throw exceptionOffline(); } throw exception(e.getMessage()); } catch (const std::exception& e) { // 统一处理标准异常 throw exception(); } }
简化业务函数实现
现在业务函数只需调用这个模板,传入核心逻辑函数和对应参数即可:
returnType1 doSomething1(param1) { return errorCheck(doSomething1Inner, param1); } // 多参数函数同样适配 returnType2 doSomething2(int param1, std::string param2) { return errorCheck(doSomething2Inner, param1, param2); } // 核心逻辑是成员函数时,用lambda捕获this returnType3 doSomething3(double param) { return errorCheck([this](auto&& p) { return doSomething3Inner(p); }, param); }
方案优势
- 可维护性:后续修改错误处理逻辑(比如调整异常类型、修改判断条件),只需改动
errorCheck一处,无需逐个修改几百个业务函数。 - 通用性:模板自动推导返回类型和参数类型,无论业务函数返回
int、自定义对象还是void,都能正常工作。 - 高效性:使用
std::forward完美转发参数,不会产生额外拷贝开销。
内容的提问来源于stack exchange,提问作者Matthew Cornelisse
相关产品推荐
相关产品推荐

