Мне кажется, что вы пытаетесь использовать исключения как (более или менее) замену регистрации. Я думаю, что в этом случае вам было бы намного лучше использовать их вместе - в частности, у меня, вероятно, был бы небольшой обработчик исключений, который помещал бы выходные данные в журнал, поэтому ваш код будет выглядеть примерно так:
try {
// start logging system
}
catch (exception const &e) { std::cerr << e.what << "error starting logging"; }
catch (...) { std::cerr << "Unknown error starting logging"; }
try {
{ scoped_log("script processing");
start_script();
}
{ scoped_log("computation");
do_computation();
}
{ scoped_log("wrap up");
wrap_up();
}
}
catch(std::exception const &e) { log << "error: " << e.what() << "\n"; }
catch(...) { log << "Unknown exception\n"; }
где "scoped_log" - это простой класс, похожий на:
class scoped_log {
std::string caption;
public:
scoped_log(std::string const &c) : caption(c) {
log << "Starting: " << caption << "\n";
}
~scoped_log() { log << "Finished: " << caption << "\n"; }
};
Это позволяет вам централизовать большинство обработки исключений. Единственное исключение (без каламбура) - запуск самой системы ведения журнала - очевидно, вы не можете использовать ведение журнала для сообщения о проблемах при запуске системы ведения журнала.
Однако, когда система ведения журнала запущена, все становится намного проще - вы используете комбинацию ведения журнала и обработки исключений, чтобы отследить, когда возникла проблема. Помните одну незначительную деталь: поскольку scoped_log
- это объект, который разрушается при выходе из области действия (по любой причине), журнал будет иметь структуру, которая может (по крайней мере изначально) казаться немного вводящей в заблуждение - сообщение об ошибке будет следовать сообщению "finshed xxx" в журнале. Например, если файл сценария не может быть открыт, ваш журнал может выглядеть примерно так:
starting script processing
finished script processing
error: could not open file: 'script.input'
По крайней мере, IMO, это вряд ли вызовет проблемы, если вы знаете ситуацию.