有没有办法处理泛型catch块中抛出的异常。
try
{
throw ;
}
catch(...)
{
// how to get handle to exception thrown
}
由于
答案 0 :(得分:8)
您可以使用std::current_exception
。
从cppreference重新排列:
#include <string>
#include <exception>
#include <stdexcept>
int main()
{
eptr;
try {
std::string().at(1); // this generates an std::out_of_range
} catch(...) {
std::exception_ptr eptr = std::current_exception(); // capture
}
}
在catch(...)
块内,exception_ptr eptr
捕获了当前异常。只要至少有一个std::exception_ptr
引用它,std::exception_ptr
引用的异常对象仍然有效:std::exception_ptr
是共享所有权智能指针。
答案 1 :(得分:0)
问题在于C ++,允许异常属于任何类型,而不仅仅是std::exception
的子类。这就是为什么常见习语只使用从std::exception
派生的异常类来建立一个连贯的接口的原因。
您可以随时使用@PaoloM建议使用std::current_exception()
。但它有一些限制使其难以使用,因为允许表示任何类型的异常,它只能std::exception_ptr
(参见cpluscplus.com}:
对象执行任何其他操作(例如解除引用),如果库实现支持,则会导致未定义的行为。
如果您希望能够处理异常情况,则应使用专用异常处理程序:
try
{
throw ;
}
catch (MyException& a) {
// Ok, it is a know type and I know how to deal with it
}
catch (std::exception& e) {
// it is a subclass of std::exception, I can at least use its what() method
catch(...)
{
// I can get a std::exception_ptr from current_exception, but cannot know what to do with it
}