c++ 如何捕获未知异常并打印它

xzv2uavs  于 2022-12-27  发布在  其他
关注(0)|答案(6)|浏览(272)

我有一个程序,每次运行它,它都会抛出异常,我不知道如何检查它到底抛出了什么,所以我的问题是,有没有可能捕获异常并打印它?(我找到了抛出异常的行)

3z6pesqy

3z6pesqy1#

如果它派生自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 (...)
{
}

但你不能对异常做任何事。

5f0d552i

5f0d552i2#

在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
a5g8bdjr

a5g8bdjr3#

如果你使用ABI来处理gcc或者CLANG,你可以知道未知的异常类型,但是这不是标准的解决方案。
请参见此处https://stackoverflow.com/a/24997351/1859469

njthzxwz

njthzxwz4#

先试试R Samuel Klatchko的建议。如果这没有帮助,还有其他方法可能会有帮助:
a)如果您的调试器支持,则在异常类型(已处理或未处理)上放置断点。
B)在某些系统上,编译器生成对(undocumented?)函数当一个throw语句被执行.要找出,什么函数那是为你的系统,写一个简单的hello world程序,那throw和catch一个异常.启动一个调试器并且放置一个断点在这异常构造函数,并查看从何处调用它。缩放函数可能类似于__throw().之后,再次启动调试器并将程序作为被调试程序进行调查.在上面提到的函数上放置断点(__throw或其他什么)并运行程序。当异常被抛出时,调试器停止,你就在那里找出原因。

biswetbf

biswetbf5#

灵感来自达维德·德罗兹德的回答:

#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();
    }
}
8wigbo56

8wigbo566#

灵感来自哈曼尼的回答:

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

相关问题