Возможно создать ваши исключения, включив в них имена исходных файлов и номера строк.Для этого вам нужно создать класс, производный от std::exception
для хранения информации.В приведенном ниже примере у меня есть библиотека исключений для моего приложения, включая my_exception
.У меня также есть traced_error
, который является классом исключений шаблона, полученным из моих исключений уровня приложения.Исключение traced_error
содержит информацию о имени файла и номере строки и вызывает метод класса исключений уровня приложения 'what()
для получения подробной информации об ошибке.
#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;
}
Вывод этой программы:
Файл:. \ Main.cpp Строка: 57 Ошибка: my_exception's what
Вы также можете изменить дизайн так, чтобы исключения уровня приложения происходили из traced_error
вместонаоборот, если вы предпочитаете ловить определенные исключения уровня приложения.В вашем catch
вы можете записать ошибку в файл журнала и создать файл дампа, используя MiniDumpWriteDump () .