如何捕获未知异常并打印出来

时间:2010-06-19 06:52:13

标签: c++ exception

我有一些程序,每次运行它时,都抛出异常,我不知道如何检查它究竟是什么抛出,所以我的问题是,是否有可能捕获异常并打印它(我发现了抛出的行例外)提前谢谢

6 个答案:

答案 0 :(得分:49)

如果它来自std::exception,您可以通过引用来捕获:

try
{
    // code that could cause exception
}
catch (const std::exception &exc)
{
    // catch anything thrown within try block that derives from std::exception
    std::cerr << exc.what();
}

但是如果异常是某个类不是从std::exception派生的,那么你必须提前知道它的类型(即你应该抓住std::string还是some_library_exception_base)。

你可以抓住所有人:

try
{
}
catch (...)
{
}

但是你不能做任何事情。

答案 1 :(得分:18)

在C ++ 11中,您有:std::current_exception

来自网站的示例代码:

#include <iostream>
#include <string>
#include <exception>
#include <stdexcept>

void handle_eptr(std::exception_ptr eptr) // passing by value is ok
{
    try {
        if (eptr) {
            std::rethrow_exception(eptr);
        }
    } catch(const std::exception& e) {
        std::cout << "Caught exception \"" << e.what() << "\"\n";
    }
}

int main()
{
    std::exception_ptr eptr;
    try {
        std::string().at(1); // this generates an std::out_of_range
    } catch(...) {
        eptr = std::current_exception(); // capture
    }
    handle_eptr(eptr);
} // destructor for std::out_of_range called here, when the eptr is destructed

答案 2 :(得分:3)

如果您对gcc或CLANG使用ABI,则可以知道未知的异常类型。但这是非标准的解决方案。

见这里 https://stackoverflow.com/a/24997351/1859469

答案 3 :(得分:1)

首先按照R Samuel Klatchko的建议尝试。如果这没有帮助,那么还有其他可能有用的东西:

a)如果调试器支持,则在异常类型(处理或未处理)上放置一个断点。

b)在某些系统上,编译器在执行throw语句时会生成对(未记录的?)函数的调用。找出你的系统的功能,编写一个简单的hello world程序,抛出并捕获异常。启动一个调试器并在例外构造函数中放置一个断点,并查看它的调用位置。 caling函数可能类似于__throw()。然后,使用要作为调试对象调查的程序再次启动调试器。将断点放在上面提到的函数上(__throw或者其他)并运行程序。抛出异常时,调试器会停止,你就在那里找出原因。

答案 4 :(得分:1)

受到Dawid Drozd的启发回答:

#include <exception>
try
{
    // The code that could throw
}
catch(...)
{
    auto expPtr = std::current_exception();

    try
    {
        if(expPtr) std::rethrow_exception(expPtr);
    }
    catch(const std::exception& e) //it would not work if you pass by value
    {
        std::cout << e.what();
    }
}

答案 5 :(得分:1)

灵感源自哈曼尼答案:

#include <iostream>
#include <string>
#include <exception>
#include <stdexcept>

int main()
{
   try
   { 
      // Your code
   }
   catch (...)
   {
      try
      {
         std::exception_ptr curr_excp;
         if (curr_excp = std::current_exception())
         {
            std::rethrow_exception(curr_excp);
         }
      }
      catch (const std::exception& e)
      {
         std::cout << e.what();
      }
   }
}