无法捕获C++异常
Can't catch a C++ exception
我想在尝试使用某个类的复制构造函数时捕获异常,这会抛出。
#include <iostream>
class dont_copy_me {
public:
dont_copy_me() {}
dont_copy_me(const dont_copy_me& rhs) {throw;}
dont_copy_me(dont_copy_me&& rhs) {throw;}
~dont_copy_me() {}
};
int main() {
try {
dont_copy_me obj;
dont_copy_me obj_1(obj);
} catch(...) {
std::cout << "exception caught" << std::endl;
}
return 0;
}
但我不断得到
terminate called without an active exception
Aborted (core dumped)
怎么了?如何捕获复制构造函数引发的异常?(因为这就是我需要的)
实际上抛出这样的异常:
#include <iostream>
#include <stdexcept>
class dont_copy_me {
public:
dont_copy_me() {}
dont_copy_me(const dont_copy_me& rhs) {throw std::runtime_error("Fail!");}
dont_copy_me(dont_copy_me&& rhs) {throw std::runtime_error("Fail!");}
~dont_copy_me() {}
};
int main() {
try {
dont_copy_me obj;
dont_copy_me obj_1(obj);
} catch(...) {
std::cout << "exception caught" << std::endl;
}
return 0;
}
这符合您的需求。在这里,您可以找到标准例外列表(在"例外类别"下)。
空throw
表达式仅在已处理活动异常时才有效:
重新引发当前处理的异常。放弃当前 catch 块的执行并将控制权传递给下一个匹配的异常处理程序(但不传递给同一 try 块之后的另一个 catch 子句:其复合语句被视为已"退出"),重用现有的异常对象:不创建新对象。仅当当前正在处理异常时,才允许使用此表单(如果以其他方式使用,则调用 std::terminate )。如果在构造函数上使用,则与函数 try-block 关联的 catch 子句必须通过重新抛出退出。
从这里开始,强调我的。
你的catch (...)
块很好,问题是你的程序没有抛出异常。
throw
表达式有两种形式:
-
throw <some-exception>
创建和引发异常 -
throw
重新引发当前异常
在代码中,您正在从复制构造函数调用第二个窗体。 请改用第一个表单。
当您想要对异常进行某些部分处理时,将使用第二种形式。 下面是一个使用这两种形式的人为示例程序:
#include <cstdexcept>
#include <cstdlib>
#include <iostream>
int main()
{
int ret = EXIT_FAILURE ;
try
{
try
{
throw std::logic_error("Fail!"); // form 1
ret = EXIT_SUCCESS;
}
catch (...)
{
std::clog << "re-throwing" << std::endl;
throw; // form 2
}
}
catch (...)
{
std::cerr << "unhandled exception" << std::endl;
}
return ret;
}
请参阅:http://en.cppreference.com/w/cpp/language/throw
相关文章:
- 处理多个异常集合的C++方法
- 我在c++代码中生成了一个运行时#3异常
- 孤立代码块在结构中引发异常
- C++中的赋值发生,尽管右侧出现异常
- 从构造函数抛出异常时如何克服内存泄漏
- 异常属于C++中的线程还是进程
- 当类定义不可见时捕获异常
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 为什么异常不退出程序?
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 如何修复链表类实现的未处理异常0xDDDDDDDD
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 是什么导致了Unity 3D中的"错误线程异常"?
- 如何将strftime中的格式错误作为异常捕获
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 尝试使用智能指针时引发异常
- 函数如何通知用户它基于函数原型抛出异常?
- 是否值得降低我的代码的可读性,以便在出现内存不足错误时提供异常安全性?
- 当我使用 C++ 中的 C# dll 来使用 Selenium 时,存在异常处理问题
- Pytorch torch.cholesky忽略异常