如何在运行时确定exception_ptr指向的异常类型?

时间:2016-04-21 08:34:47

标签: c++ c++11 exception exception-handling typeinfo

在C ++ 11及更高版本中,可以使用exception_ptr检索当前异常的current_exception()。是否可以在运行时确定指向的异常的类型?

更确切地说,如何获得type_info所指向的异常exception_ptr的引用?我知道基于类型可以catch,但程序员需要为所有可能的异常类型编写catch块,这不是解决此问题的方法。

try {
    userProvidedRuntimePlugin.executeAction(); // May throw anything
} catch (...) {
    auto e = std::current_exception();
    std::type_info & info = /* ??? */;
    std::cerr << "Exception of type " << info.name() << " thrown." << std::endl;
}

2 个答案:

答案 0 :(得分:3)

尝试以下内容:

#include <cxxabi.h>

using namespace __cxxabiv1;

std::string util_demangle(std::string to_demangle)
{
    int status = 0;
    char * buff = __cxxabiv1::__cxa_demangle(to_demangle.c_str(), NULL, NULL, &status);
    if (!buff) return to_demangle;
    std::string demangled = buff;
    std::free(buff);
    return demangled;
}

try
{
   /* .... */
}
catch(...)
{
   std::cout <<"exception type: '" << util_demangle(abi::__cxa_current_exception_type()->name()) << "'\n";
}

答案 1 :(得分:0)

不,遗憾的是,您将无法检测到异常的类型。 您的auto e变量只是类型std::exception_ptr e

如果您希望在特定类型的异常上表现不同,那么您应该首先捕获此异常。例如:

try{
    userProvidedRuntimePlugin.executeAction(); // May throw anything
} catch (std::exception e) {
    //handle std::exception
} catch (your::exception e2) {
    //handle your::exception
}catch (...) {
    std::exception_ptr e = std::current_exception();
    cout << "unknown exception" << endl;
    std::rethrow_exception(e); // for example
}

如果您不知道如何处理此级别的意外异常,则可以选择使用std::rethrow_exception(e);

重新抛出异常