假设我们有一些带有默认构造函数的类(称之为classs
),它可以抛出一些异常。我需要在函数中使用该类的对象,如下所示:
try{
classs c;
} catch(bad_init& b){
//log
}
//if the class initialized succesfully
//do some with c
但是 c
是在 try
的 block 作用域中声明的,因此在函数作用域中是不可见的。我怎样才能做到这一点?
我不想包装整个函数的主体,因为有些代码会抛出另一种异常。
最佳答案
您不能直接这样做。只要 c
在范围内,代码就有权假定是否包含 classs
类型的事件对象。如果构造函数抛出异常,c
将不会被初始化并且不能保持。
正确的做法是将 c
的整个作用域包裹在 try
block 中。毕竟,如果 c
初始化失败,使用 c
的代码将无法做任何有意义的事情。如果该 block 后面的一些其他代码可以抛出其他异常,而您不想捕获它们,那就不要捕获它们——让它们正常向上传播堆栈。
如果由于某种原因你不能使用这种方法,你可以求助于 boost::optional
和延迟初始化:
boost::optional<classs> c;
try {
c = classs();
} catch (bad_init&) {
}
或者使用 std::aligned_storage
、放置 new
和条件析构函数调用手动执行类似的操作。
关于c++ - 默认初始化抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31425527/