默认初始化抛出异常
Default initialization throws exception
假设我们有一个类(称为classs
),它的默认构造函数可能抛出一些异常。我需要在函数中使用该类的对象,如下所示:
try{
classs c;
} catch(bad_init& b){
//log
}
//if the class initialized succesfully
//do some with c
但是c
是在try
的块作用域中声明的,因此在函数作用域中不可见。我该怎么做呢?
我不想包装整个函数体,因为有些代码会抛出另一种异常。
您不能直接这样做。只要c
在作用域中,代码就有权假定它包含classs
类型的活动对象。如果构造函数抛出异常,c
将不会初始化,并且不能保持。
正确的方法是将c
的整个作用域包装在try
块中。毕竟,如果c
初始化失败,使用c
的代码就不能做任何有意义的事情。如果该块后面的其他代码可能会抛出其他异常,而您不想捕获它们,那么就不要让它们在堆栈中正常传播。
如果由于某种原因不能使用这种方法,您可以求助于boost::optional
和延迟init:
boost::optional<classs> c;
try {
c = classs();
} catch (bad_init&) {
}
或者手动执行std::aligned_storage
,放置new
和条件析构函数调用的类似操作。
变通方法是使用std::unique_ptr
:
std::unique_ptr<A> a;
try{
a = std::make_unique<A>();
} catch(bad_init& b){
//log
}
if (a){
//do
}
我将简单地在调用者级别捕获异常。没必要把事情弄复杂。
void functionThatThrows()
{
classs c;
// do something with c
}
void callerThatCatches()
{
try {
functionThatThrows();
} catch(...) {
// handle exception
}
}
最简单的方法就是扩展try块,直到你不再需要你的对象:
try{
classs c;
//if the class initialized succesfully
//do some with c
} catch(bad_init& b){
//log
}
相关文章:
- 从构造函数抛出异常时如何克服内存泄漏
- 函数如何通知用户它基于函数原型抛出异常?
- 在缺少函数重载时抛出异常,并带有 std::variant 而不是编译时错误
- VisualStudios 会抛出异常,而代码块不会 [C++]
- 如果不包含 pthread,为什么 GCC 的线程标准库实现会抛出异常?
- ZMQ::send() 抛出异常并终止 QNX 进程.为什么以及如何从中恢复?
- new(std::nothrow) int[n] 抛出异常
- 为什么g_object_set抛出异常(vcruntime140.dll)?
- 你能防止 std::regex 在无效表达式上抛出异常吗?
- C++子线程抛出异常
- 我们应该在抛出异常之前取消分配内存吗
- 有没有一种方法可以让OpenCLC++绑定为所有错误抛出异常
- 为什么访问模板化变体作为返回值抛出异常
- 如何实现,错误分配中止而不是抛出异常
- std::p riority_queue::p op什么时候会抛出异常
- 初始化不正确的价值不良样式后,正在抛出异常
- c++如何处理抛出异常的初始值设定项
- 可以抛出未初始化的 std::可选或 boost::可选构造函数
- 默认初始化抛出异常
- PCL可视化器-退出可视化器窗口时从Eigen抛出异常