查找初始化列表中的哪个成员抛出了例外
Finding which member in an initializer list threw an exception
说我有一个类型的成员。我知道具有初始化器列表的try-catch
块的语法如下
template<int N>
struct Member
{
Member()
{
std::cout << "Default constructor of Member " << N << std::endl;
}
};
class A
{
Member<1> m1;
Member<2> m2;
// n members
public:
A() try
: m1()
, m2()
{
// constructor implementation
}
catch (std::exception const & e)
{
// ... cleanup
throw; // and rethrow
}
};
由于涉及初始化器列表,因此我不能使用多个尝试捕获块。我该如何判断哪个成员初始化抛出了例外?
您可以跟踪初始化过程
class A
{
Member<1> m1;
bool m1threw = true;
Member<2> m2;
bool m2threw = true;
// n members
public:
A() try
: m1()
, m1threw(false)
, m2()
, m2threw(false)
{
// constructor implementation
}
catch (std::exception const & e)
{
// ... cleanup
if (m1threw) {
//
}
else if (m2threw) {
}
throw; // and rethrow
}
};
note 在类初始化中仅在C 11中有效。使您的示例更加复杂的是成员变量默认构建。如果他们的构造函数接受了一个论点,这将是构建跟踪器成语
的完美匹配我为成员提供了一个非默认构造函数,以展示构建示踪iDIOM
template<int N>
struct Member
{
Member(int some_arg)
{
std::cout << "Non default constructor of Meber " << N << std::endl;
}
};
class A
{
Member<1> m1;
Member<2> m2;
enum TrackerType { NONE, ONE, TWO };
public:
A(TrackerType tracker = NONE)
try // A constructor try block.
: m1((tracker = ONE, 1)) // Can throw std::exception
, m2((tracker = TWO, 1)) // Can throw std::exception
{
//TODO:
}
catch (std::exception const & e)
{
if (tracker == ONE) {
std::cout << "m1 threw: " << e.what() << std::endl;
}
else if (tracker == TWO) {
std::cout << "m2 threw: " << e.what() << std::endl;
}
throw;
}
};
本质上,这不需要额外的成员才能实现追踪,并且可以在11
template<int N>
struct Member
{
Member()
{
std::cout << "Default constructor of Member " << N << std::endl;
// ...
if (bad_thing)
{
throw N;
}
}
};
class A
{
Member<1> m1;
Member<2> m2;
// n members
public:
A() try
: m1()
, m2()
{
// ...
}
catch (int N)
{
std::cout << "construction of member " << N << " failed" << std::endl;
// ...
}
};
相关文章:
- C++ 双向链表:使用矩阵类成员创建和填充列表
- 模板化检查是否存在带有参数列表的类成员函数?
- 如何将类成员方法的参数列表自动填充写入可变参数?
- 为什么我需要在成员发起器列表中重复基类的模板参数?
- 如何将成员函数作为参数传递并在派生对象上执行方法列表
- 扩展初始值设定项列表和未初始化的成员
- 在成员初始值设定项列表中分配unique_ptr
- 如何在构造器的成员初始值设定项列表中调用两个函数?
- 将初始化器列表/聚合初始化转发到 std::array 成员
- 使用成员初始值设定项列表时没有匹配的函数调用错误
- 类成员函数参数列表是否可以依赖于模板参数?
- 传递可变参数时在成员初始值设定项列表中强制转换
- 解释了构造函数成员初始化列表
- C/C++intellisense 0.26.1不显示结构成员列表
- 如何从 IBM i 文件中获取成员列表
- 类成员列表的C++模板构造
- C++列表:复制成员列表中的本地列表
- 不同类的成员列表实现不起作用
- 如何从类型列表继承,然后调用继承成员列表中的成员
- 类构造函数:不允许类型不完整(在成员列表中)-VS C++w/QT