我在try / catch块中创建了我的类的对象,并且想要在异常情况下在catch块中访问它。即使对象创建正常,我也无法在catch块中访问它,因为它在块外部声明。
try {
MyObject ob(arg1,arg2); //this can trow exception
ob.func1(); //this also can throw exception
} catch (std::exception& ex){
//I want to access ob here if it was constructed properly and get the reason why func1() failed
}
我可以使用嵌套的try / catch块来解决这个问题,但有没有其他方法可以解决这个问题
try {
MyObject ob(arg1,arg2); //this can trow exception
try {
ob.func1(); //this also can throw exception
} catch(std::exception& ex) {
//object was constructed ok, so I can access reason/state why the operation failed
}
} catch (std::exception& ex){
//object failed to construct
}
答案 0 :(得分:3)
不,你不能这样做。无法从同一级别的catch块访问此变量。
解决方案是停止使用异常作为流量控制机制 - 它们不是 - 并按原样使用它们,表示异常情况 - 在这种情况下,投掷的内容并不重要。
答案 1 :(得分:1)
不,您无法访问超出范围的对象。但要回答这个问题:
了解func1()失败的原因
如果对象构造因异常而失败,则意味着std :: exception已经包含有关失败原因的一些信息。 所以你必须在代码中执行此操作:
catch (std::exception& ex){
// object failed to construct
std::cout << ex.what() << std::endl;
}
答案 2 :(得分:0)
Andrei Alexandrescu's ScopeGuard可能对此有所帮助:
try {
MyObject ob(arg1,arg2);
SCOPE_FAIL { /* Handler 1 */ };
ob.func1();
} catch (std::exception& ex) {
/* Handler 2 */
}
如果SCOPE_FAIL
的范围是通过堆栈展开留下的,那么它将被执行,也就是说,抛出了一个异常。很遗憾,您无法在那里访问异常,但您可以访问ob
。
程序的其余部分与往常一样,因此执行如下:
ob
已成功构建; ob.func1()
已执行并抛出; /* Handler 1 */
已执行; ob
被破坏; /* Handler 2 */
已执行。