无法捕获C++异常

Can't catch a C++ exception

本文关键字:C++ 异常      更新时间:2023-10-16

我想在尝试使用某个类的复制构造函数时捕获异常,这会抛出。

#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表达式有两种形式:

  1. throw <some-exception>创建和引发异常
  2. 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