无法捕获C ++异常

时间:2015-03-07 21:40:56

标签: 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)

有什么问题?如何捕获复制构造函数抛出的异常? (因为那就是我需要的)

2 个答案:

答案 0 :(得分:6)

实际上抛出这样的例外:

#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;
}

这可以满足您的需求。 Here您可以找到标准例外列表(在“例外类别”下)。

throw表达式仅在您处理活动异常时才有效:

  

重新显示当前处理的异常。放弃当前catch块的执行并将控制传递给下一个匹配的异常处理程序(但不会在同一个try块之后传递给另一个catch子句:它的compound-statement被认为已经'退出'),重用现有的异常对象:没有新的对象。 此表单仅在当前正在处理异常时允许(如果另外使用,则调用std :: terminate)。如果在构造函数上使用,则与函数try-block关联的catch子句必须通过rethrowing退出。

来自here,强调我的。

答案 1 :(得分:2)

你的catch (...)块很好,问题是你的程序不会抛出异常。

throw表达式有两种形式:

  1. throw <some-exception>创建并抛出异常
  2. throw重新抛出当前例外
  3. 在您的代码中,您正在从复制构造函数中调用第二个表单。请改用第一个表格。

    当您想要部分处理异常时,将使用第二种形式。这是一个使用两种形式的人为的示例程序:

    #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