Use throw_with_nested e capture a exceção aninhada
Eu realmente gosto std :: throw_with_nested em c + + 11, uma vez que emula printStackTrace () do java, mas agora estou apenas curioso como capturar uma exceção aninhada, por exemplo:
void f() {
try {
throw SomeException();
} catch( ... ) {
std::throw_with_nested( std::runtime_error( "Inside f()" ) );
}
}
void g() {
try {
f();
} catch( SomeException & e ) { // I want to catch SomeException here, not std::runtime_error, :(
// do something
}
}
Anteriormente, eu pensava que std :: throw_with_nested gera uma nova exceção que é multiplamente derivada de duas exceções (std :: runtime_error e SomeException) mas depois de ler algum tutorial online, ele encapsula SomeException dentro de std :: exception_ptr e é probabaly porque eu não consigo pegá-lo .
Então eu percebi que eu posso consertar isso usando std :: rethrow_if_nested (e), mas o caso acima é apenas dois níveis, o que é fácil de manejar, mas pensando em situações mais gerais como 10 level fold e eu simplesmente não quero escrever std: : rethrow_if_nested 10 vezes para lidar com isso.
Qualquer sugestão seria muito apreciada.