能否为每个类成员初始化器单独设置function-try-block?
C++类成员初始化时针对不同成员捕获并包装异常的解决方案
在类的成员初始化阶段,若需要针对不同成员(如.x和.y)的初始化异常分别处理——捕获原始异常后添加上下文,再抛出对应的自定义异常(XError或YError)——function-try-block无法满足需求,因为它会捕获构造函数整个初始化流程的所有异常,无法区分异常来自哪个成员。
可行解决方案:为每个成员编写异常包装函数
通过将单个成员的初始化逻辑封装到独立函数中,在函数内部捕获原始异常并包装为目标异常,再在构造函数的初始化列表中调用这些包装函数,就能实现针对性的异常处理。
代码示例
- 定义自定义异常类型
#include <stdexcept> #include <string> // 针对成员x的异常类型 struct XError : std::runtime_error { using std::runtime_error::runtime_error; }; // 针对成员y的异常类型 struct YError : std::runtime_error { using std::runtime_error::runtime_error; };
- 编写成员初始化的包装函数
假设XType和YType是类成员的类型,它们的构造可能抛出通用异常:
XType create_x() { try { // 这里是成员x的初始化逻辑,比如调用可能抛异常的构造函数 return XType{}; } catch (const std::exception& e) { // 添加上下文后抛出XError throw XError("初始化成员x失败: " + std::string(e.what())); } } YType create_y() { try { // 成员y的初始化逻辑 return YType{}; } catch (const std::exception& e) { // 添加上下文后抛出YError throw YError("初始化成员y失败: " + std::string(e.what())); } }
- 在类构造函数中使用包装函数初始化成员
class MyClass { XType x; YType y; public: // 通过包装函数初始化成员,异常已被针对性包装 MyClass() : x(create_x()), y(create_y()) {} };
为什么function-try-block无法满足需求
如果尝试使用function-try-block,代码结构如下:
MyClass() try : x(XType{}), y(YType{}) { // 构造函数体 } catch (const std::exception& e) { // 无法区分异常来自x还是y,无法针对性抛出XError/YError throw; }
function-try-block的catch块会捕获初始化列表和构造函数体中抛出的所有异常,但无法定位异常的具体来源,因此无法实现为不同成员的异常添加差异化上下文的需求。
内容的提问来源于stack exchange,提问作者Adam Barnes
相关产品推荐
相关产品推荐

