Вопрос: Является ли использование исключений подходящим способом для завершения моей программы, если все, что я хочу, это показать сообщение об ошибке и закрыть (учитывая, что я могу быть глубоко в программе)? Могу ли я просто явно вызвать что-то вроде exit() вместо?
Что я сейчас делаю:
Я работаю над игровым проектом и пытаюсь найти лучший способ прекратить работу программы в случае ошибки, требующей такого действия. Например, в случае, когда текстуры не могут быть загружены, отображается сообщение об ошибке и завершается выполнение программы.
В настоящее время я делаю это с такими исключениями:
int main()
{
Game game;
try
{
game.run();
}
catch (BadResolutionException & e)
{
Notification::showErrorMessage(e.what(), "ERROR: Resolution");
return 1;
}
catch (BadAssetException & e)
{
Notification::showErrorMessage(e.what(), "ERROR: Assets");
return 1;
}
catch (std::bad_alloc & e)
{
Notification::showErrorMessage(e.what(), "ERROR: Memory");
return 1;
}
return 0;
}
Все, кроме bad_alloc, являются моими собственными определенными исключениями, полученными из runtime_error.
Мне не нужна ручная очистка ресурсов, и я использую std:: unique_ptr для любого динамического выделения. Мне просто нужно отобразить сообщение об ошибке и закрыть программу.
Исследования/альтернативы исключениям:
Я просмотрел много сообщений о SO и других местах, и видел, как другие говорят что-либо из того, что не используют исключения, использовать исключения, но вы неправильно их используете. Я также посмотрел прямо на вызов, например, exit().
Использование exit() звучит неплохо, но я читаю, что он не вернется через стек вызовов до основной очистки всех вещей (если я смогу найти это снова, я отправлю ссылку). Кроме того, согласно http://www.cplusplus.com/reference/cstdlib/exit/, это не должно использоваться, если несколько потоков активны. Я ожидаю создать второй поток в течение короткого времени хотя бы один раз, и в этом потоке может произойти ошибка.
Не использование исключений упоминалось в некоторых ответах здесь относительно игр https://gamedev.stackexchange.com/info/103285/how-industy-games-handle-their-code-errors-and-exceptions
Использовать исключения обсуждалось здесь: http://www.quora.com/Why-do-some-people-recommend-not-using-exception-handling-in-C++
Есть несколько других источников, которые я прочитал, но это были самые последние, на которые я смотрел.
Личный вывод:
Из-за моего ограниченного опыта работы с обработкой ошибок и использованием исключений я не уверен, что я на правильном пути. Я выбрал маршрут использования исключений на основе кода, который я написал выше. Если вы согласны с тем, что я должен решать эти случаи с исключениями, правильно ли использую их?