You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何复用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 15:08:30