在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;
}
答案 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);