dimanche 1 février 2015

Can I use std::current_exception during stack unwinding?

Should it be possible to use std::current_exception inside destructors of objects that are destroyed during stack unwinding?


Documentation on cppreference says:



If called during exception handling (typically, in a catch clause), captures the current exception object (...)



But it's not clear for me whether stack unwinding is a part of exception handling.


In some answer on stackoverflow, the highest-ranked answer assumes, that it's possible.


I did some test on my compiler (g++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2) and it seems, that std::current_exception returns empty pointer in this case.



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


struct A
{
~A()
{
std::clog<< "in destructor"<<std::endl;
std::clog<< "uncaught_exception: " << std::uncaught_exception() << std::endl;
std::clog<< "current_exception: " << (bool)std::current_exception() << std::endl;
}
};

int main(int argc, char **)
{
try
{
A aa;
std::clog<< "before throw"<<std::endl;
if(argc>1)
throw std::runtime_error("oh no");
}
catch(...)
{
std::clog<< "in catch block"<<std::endl;
std::clog<< "uncaught_exception: " << std::uncaught_exception() << std::endl;
std::clog<< "current_exception: " << (bool)std::current_exception() << std::endl;
}

return 0;
}


The output is:



before throw
in destructor
uncaught_exception: 1
current_exception: 0
in catch block
uncaught_exception: 0
current_exception: 1


Does anybody know the standard says?


Aucun commentaire:

Enregistrer un commentaire