如果在成员中抛出异常,则删除母对象
delete mother object if exception thrown in member
我有以下问题:
如果在其中一个成员的构造函数中抛出异常,我想删除一个母对象。
我该怎么做?
以下不是我想要的。正好你有东西可以参考...
#include <iostream>
struct A
{
A(int i)
:mem(0)
{
try{
if(i > 9) throw 0;
}catch(int x) { std::cout << "mem max size 9\n"; return;}
mem = i;
}
int mem;
};
struct B
{
B(int i)
:mem(i)
{
}
const A mem;
};
int main()
{
B b1(2);
B b2(10);
std::cout << "b1: " << b1.mem.mem << std::endl;
std::cout << "b2: " << b2.mem.mem << std::endl;
}
//~ output:
//~ mem max size 9
//~ b1: 2
//~ b2: 0
编辑
根据 this link 我更改了我的代码如下
#include <iostream>
struct A
{
A(int i)
:mem(0)
{
if(i > 9) throw 0;
else mem = i;
}
int mem;
};
struct B
{
B(int i)
try
:mem(i)
{
}
catch(int e)
{
std::cerr << "Error #" << e << std::endl;
}
const A mem;
};
int main()
{
B b1(2);
B b2(10);
}
//~ output:
//~ Error #0
//~ terminate called after throwing an instance of 'int'
//~ Aborted
但是,我不希望程序中止...我该如何防止这种情况发生?
如果我这样做,程序不会中止,但 B 对象正在构造,尽管有异常...
#include <iostream>
struct A
{
A(int i)
:mem(0)
{
try
{
if(i > 9) throw 0;
}
catch(int e)
{
std::cerr << "A Error #" << e << std::endl; return;
}
mem = i;
}
int mem;
};
struct B
{
B(int i)
try
:mem(i)
{
}
catch(int e)
{
std::cerr << "Error #" << e << std::endl;
}
const A mem;
};
int main()
{
B b1(2);
B b2(10);
std::cout << "b1: " << b1.mem.mem << std::endl;
std::cout << "b2: " << b2.mem.mem << std::endl;
}
//~ A Error #0
//~ b1: 2
//~ b2: 0
如果我在 A 中重新抛出捕获程序,程序将再次中止...
B
的构造函数没有得到异常,因为 A
的构造函数正在捕获它。去掉那里的 try
块:
A(int i)
:mem(0)
{
if(i > 9) {
std::cout << "mem max size 9\n";
throw 0;
}
mem = i;
}
如果您尝试在 B
的初始化程序列表中捕获异常,它无论如何都会被重新抛出,因此不要在那里捕获异常,而是在 main
中捕获它:
int main()
{
try {
B b1(2);
std::cout << "b1: " << b1.mem.mem << std::endl;
} catch (int e) {
std::cout << "failed to create b1" << std::endl;
}
try {
B b2(10);
} catch (int e) {
std::cout << "failed to create b2" << std::endl;
}
}
我有以下问题:
如果在其中一个成员的构造函数中抛出异常,我想删除一个母对象。 我该怎么做?
以下不是我想要的。正好你有东西可以参考...
#include <iostream>
struct A
{
A(int i)
:mem(0)
{
try{
if(i > 9) throw 0;
}catch(int x) { std::cout << "mem max size 9\n"; return;}
mem = i;
}
int mem;
};
struct B
{
B(int i)
:mem(i)
{
}
const A mem;
};
int main()
{
B b1(2);
B b2(10);
std::cout << "b1: " << b1.mem.mem << std::endl;
std::cout << "b2: " << b2.mem.mem << std::endl;
}
//~ output:
//~ mem max size 9
//~ b1: 2
//~ b2: 0
编辑
根据 this link 我更改了我的代码如下
#include <iostream>
struct A
{
A(int i)
:mem(0)
{
if(i > 9) throw 0;
else mem = i;
}
int mem;
};
struct B
{
B(int i)
try
:mem(i)
{
}
catch(int e)
{
std::cerr << "Error #" << e << std::endl;
}
const A mem;
};
int main()
{
B b1(2);
B b2(10);
}
//~ output:
//~ Error #0
//~ terminate called after throwing an instance of 'int'
//~ Aborted
但是,我不希望程序中止...我该如何防止这种情况发生?
如果我这样做,程序不会中止,但 B 对象正在构造,尽管有异常...
#include <iostream>
struct A
{
A(int i)
:mem(0)
{
try
{
if(i > 9) throw 0;
}
catch(int e)
{
std::cerr << "A Error #" << e << std::endl; return;
}
mem = i;
}
int mem;
};
struct B
{
B(int i)
try
:mem(i)
{
}
catch(int e)
{
std::cerr << "Error #" << e << std::endl;
}
const A mem;
};
int main()
{
B b1(2);
B b2(10);
std::cout << "b1: " << b1.mem.mem << std::endl;
std::cout << "b2: " << b2.mem.mem << std::endl;
}
//~ A Error #0
//~ b1: 2
//~ b2: 0
如果我在 A 中重新抛出捕获程序,程序将再次中止...
B
的构造函数没有得到异常,因为 A
的构造函数正在捕获它。去掉那里的 try
块:
A(int i)
:mem(0)
{
if(i > 9) {
std::cout << "mem max size 9\n";
throw 0;
}
mem = i;
}
如果您尝试在 B
的初始化程序列表中捕获异常,它无论如何都会被重新抛出,因此不要在那里捕获异常,而是在 main
中捕获它:
int main()
{
try {
B b1(2);
std::cout << "b1: " << b1.mem.mem << std::endl;
} catch (int e) {
std::cout << "failed to create b1" << std::endl;
}
try {
B b2(10);
} catch (int e) {
std::cout << "failed to create b2" << std::endl;
}
}