c++ - 默认初始化抛出异常

标签 c++ exception

假设我们有一些带有默认构造函数的类(称之为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/

相关文章:

swift - “ fatal error :在展开可选值时意外发现nil”是什么意思?

c++ - STL 迭代器 : "dereferencing" iterator to a temporary. 可能吗?

Java 相当于 CLR 的 UnhandledException 事件

python - "cheap exceptions"是解释型语言的典型值吗?

exception - RISC-V SYSTEM 指令如何实现为陷阱?

java - 对一个异常禁用日志记录

c++ - 在 C++ 中使用运算符重载显示不正确的结果

c++ - 使用 set_difference 时出现编译错误

c++ - 如何找到 setitimer() 的分辨率?

c++ - 访问冲突读取位置错误 C++ OpenCV While Implementing thinning algorithm