如果我在构造函数体内初始化成员字段,我可以通过用 try-catch 块包围每个变量初始化来单独捕获异常。例如:
#include <memory>
struct A {
std::unique_ptr<int[]> data1, data2;
A();
};
A::A()
{
try {
data1 = new int[5];
}
catch (std::bad_alloc& ex) {
/* Do something */
}
try {
data2 = new int[5];
}
catch (std::bad_alloc& ex) {
/* Do something */
}
}
在代码中,当 data1 或 data2 分配失败时,我可能想做一些不同的事情。
现在,直接在初始化列表中初始化 data1 和 data2 怎么样?我仍然可以捕捉
bad_alloc
,正如这里和这里所讨论的:
#include <memory>
struct A {
std::unique_ptr<int[]> data1, data2;
A();
};
A::A()
try : data1{new int[5]},
data2{new int[5]}
{
}
catch (std::bad_alloc& ex) {
/* Do something */
}
这样做,但是,当捕获
bad_alloc
时,我不知道这是否是由 data1 或 data2 的新语句引发的。
我可以区分 data1 和 data2 的初始化是否会抛出不同的异常;这里的情况并非如此。
如何区分初始化列表中可能引发的异常?
尝试将您的新闻包装在成员函数中。捕获这些函数中的异常,并采取相应的行动。
#include <memory>
struct A {
std::unique_ptr<int[]> data1, data2;
A();
private:
std::unique_ptr<int[]> wrap_data1();
std::unique_ptr<int[]> wrap_data2();
};
std::unique_ptr<int[]> A::wrap_data1() {
try {
return std::make_unique<int[]>(5);
}
catch (std::bad_alloc& ex) {
std::cout << "Allocation for data1 failed: " << ex.what() << std::endl;
throw;
}
}
std::unique_ptr<int[]> A::wrap_data2() {
try {
return std::make_unique<int[]>(5);
}
catch (std::bad_alloc& ex) {
std::cout << "Allocation for data2 failed: " << ex.what() << std::endl;
throw;
}
}
A::A()
try : data1{wrap_data1()},
data2{wrap_data2()}
{
}
catch (std::bad_alloc& ex) {
/* Do something */
}