Recientemente comencé a usar boost :: exception. Ahora me gustaría utilizar boost :: errinfo_nested_exception para imprimir información sobre la causa del error. El problema es que no puedo entender cómo obtener información de la causa. He intentado lo siguiente sin éxito:¿Cómo extraigo información de boost :: errinfo_nested_exception?
#include <iostream>
#include <boost/exception/all.hpp>
struct myex : public virtual boost::exception {};
int main()
{
myex cause;
cause << boost::errinfo_file_name("causefile.cpp");
try {
myex ex;
ex << boost::errinfo_nested_exception(boost::copy_exception(cause));
throw ex;
}
catch (myex& e) {
// Here I would like to extract file name from cause and print
// it in a nice way, but I cant figure out what to do with a
// boost::exception_ptr.
const boost::exception_ptr* c =
boost::get_error_info<boost::errinfo_nested_exception>(e);
// I cant do this:
// const std::string* file = boost::get_error_info<boost::errinfo_file_name>(*c);
// Nor this:
// const std::string* file = boost::get_error_info<boost::errinfo_file_name>(**c);
// This works fine and the nested exception is there, but that's not what I want.
std::cout << boost::diagnostic_information(e) << std::endl;
}
return 0;
}
un poco extraño a tener que retrhow, pero supongo que es una rareza en el impulso . Tal vez tiene algo que ver con tipear. De todos modos, resolvió mi problema. ;) – ygram
@ygram Viene de cómo se especifica 'boost :: exception_ptr' - su interfaz es bastante minimalista, y la única manera de hacer algo útil con la excepción * stored * (en oposición al puntero en sí) es volver a lanzar . Dado que ha sido aceptado en 'std :: exception_ptr' y que los idiomas permiten lanzar, p. 'int', en realidad es un diseño bastante sólido. –