从初始化列表中捕获多个异常

问题描述 投票:0回答:1

如果我在构造函数体内初始化成员字段,我可以通过用 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 的初始化是否会抛出不同的异常;这里的情况并非如此。

如何区分初始化列表中可能引发的异常?

c++ exception initializer-list
1个回答
0
投票

尝试将您的新闻包装在成员函数中。捕获这些函数中的异常,并采取相应的行动。

#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 */
}
© www.soinside.com 2019 - 2024. All rights reserved.