Es posible diseñar sus excepciones para incluir los nombres de los archivos de origen & números de línea. Para hacerlo, debe crear una clase derivada de std::exception
para contener la información. En el siguiente ejemplo, tengo una biblioteca de excepciones para mi solicitud, que incluye my_exception
. También tengo un traced_error
que es una clase de excepción de plantilla derivada de mis excepciones de nivel de aplicación.La excepción traced_error
contiene información sobre el número de línea del archivo & y llama al método de clase de excepción de nivel de aplicación 'what()
para obtener información detallada del error.
#include <cstdlib>
#include <string>
#include <stdexcept>
#include <iostream>
using namespace std;
template<class EX>
class traced_error : virtual public std::exception, virtual public EX
{
public:
traced_error(const std::string& file, int line, const EX& ex)
: EX(ex),
line_(line),
file_(file)
{
}
const char* what() const
{
std::stringstream ss;
static std::string msg;
ss << "File: " << file_ << " Line: " << line_ << " Error: " << EX::what();
msg = ss.str().c_str();
return msg.c_str();
}
int line_;
std::string file_;
};
template<class EX> traced_error<EX> make_traced_error(const std::string& file, int line, const EX& ex)
{
return traced_error<EX>(file, line, ex);
}
class my_exception : virtual public std::exception
{
public:
my_exception() {};
const char* what() const
{
return "my_exception's what";
}
};
#define throwx(EX) (throw make_traced_error(__FILE__,__LINE__,EX))
int main()
{
try
{
throwx(my_exception());
}
catch(const std::exception& ex)
{
cout << ex.what();
}
return 0;
}
La salida de este programa es:
File: .\main.cpp Line: 57 Error: my_exception's what
También puede rediseñar este modo que las excepciones a nivel de aplicación se derivan de traced_error
en lugar de a la inversa, en caso de que prefiere coger específica excepciones de nivel de aplicación. En su catch
, puede registrar el error en un archivo de registro & crear un archivo de volcado usando MiniDumpWriteDump().
posible duplicado de [C++ muestra el seguimiento de la pila en la excepción] (http://stackoverflow.com/questions/691719/c-display-stack-trace-on-exception) – sth