我是C ++中异常处理的新手,最近我遇到了一些问题。
在我的代码中,我想创建一个对象,只有其中一个。我正在与一个库连接,我必须为构造函数提供输入。以下是对构造函数的调用:
ObjectA my_object(param1, param2, param3);
我的问题是构造函数本身可以抛出异常。我过去曾做过有限的异常工作(我知道try-catch机制),但由于范围可变,我不知道该怎么做。例如:
try {
ObjectA my_object(param1, param2, param3);
}
catch {
// don't worry I need to do more than this here, just an example...
cout << "OMFG!" << endl;
exit(EXIT_FAILURE);
}
// if code got here, everything with my_object is OK
my_object.Method1(param1); // ERROR: my_object is out of scope!
我可以快速了解一些帮助,以便检查正确构造的对象。感谢
答案 0 :(得分:2)
好吧,就像这样:
try {
ObjectA my_object(param1, param2, param3);
my_object.Method1(param1);
// other work
}
catch (/* the exception that constructor can throw */ ){
// error handling stuff
}
如果try
块变大,则将代码从其移动到另一个函数。
答案 1 :(得分:2)
如果操作次数很少,有时您会这样做:
try {
ObjectA my_object(param1, param2, param3);
my_object.Method1(param1);
}catch(...)
{exit(EXIT_FAILURE);}
通常,如果构造函数可以抛出异常,则存在另一种无异常的initailize方法:
ObjectA my_object; //may or may not be valid by itself
try {
my_object = ObjectA(param1, param2, param3); //initialize and copy-construct
//alternatively:
my_object.open(param1, param2, param3);
}catch(...)
{exit(EXIT_FAILURE);}
my_object.Method1(param1);
否则,最推荐的解决方案是:
boost::optional<ObjectA> my_object; //make it OPTIONAL
try {
my_object = ObjectA(param1, param2, param3); //initialize and copy-construct
}catch(...)
{exit(EXIT_FAILURE);}
my_object.Method1(param1);
(如果你不喜欢提升,optional
如果你知道新的工作方式是如何工作那么自己实现起来非常简单。
如果可选的东西太吓人了,它也可以通过动态内存轻松复制:
std::unique_ptr<ObjectA> my_object; //make it OPTIONAL
try {
my_object.reset(new ObjectA(param1, param2, param3)); //initialize and copy-construct
}catch(...)
{exit(EXIT_FAILURE);}
my_object->Method1(param1);
答案 2 :(得分:1)
void doStuff()
{
ObjectA my_object(param1, param2, param3);
my_object.Method1(param1);
}
try {
doStuff();
}
catch {
// don't worry I need to do more than this here, just an example...
cout << "OMFG!" << endl;
exit(EXIT_FAILURE);
}
或简单地将所有相关语句放在try块中。