Стандарт C ++ имеет несколько классов исключений, которые все являются производными от. Я предлагаю вам сделать это вместо того, чтобы бросать и ловить POD. Это тоже не сложно и улучшит (и укажет тип ошибки) примерно так
class CalculationError : std::invalid_argument
{
public:
CalculationError(std::string const& msg)
: std::invalid_argument(msg)
{}
};
Для быстрого обзора иерархии исключений перейдите на http://www.richelbilderbeek.nl/CppExceptionHierarchy.htm
Проблема в том, что когда вы выбрасываете тип POD, прикрепленное сообщение отсутствует. Большая часть создания исключений - это возможность написать сообщение о том, что могло пойти не так, и как это исправить. Это невозможно при броске int.
В C ++ есть три потока вывода: log, cerr и cout. Каждый из них представлен по-разному, что означает, что при запуске вашей программы вы можете использовать командную строку для фильтрации каждого из этих потоков. Это отлично подходит для отладки, так как вы можете отфильтровать по cerr и посмотреть, не прошла ли ваша программа тест.
Пример: my_program > out.txt 2> log.txt
(cout идет в out.txt, остальные в log.txt)
Однако я бы порекомендовал не просто серринг. Обычно смысл в улове - изменить состояние программы! Если, например, вы попытались выделить динамический массив, и это не удалось, то перехватчик будет ответственен за уничтожение массива перед повторным выбрасыванием. В противном случае у вас будет целый ряд вещей, таких как утечки памяти и еще много чего.
Также важно отметить, что, будучи пойманным, исключение «проглатывается». Если вы не можете или не хотите иметь дело с ошибкой здесь, лучше написать
catch(/* Error to be caught */)
{
throw; // Rethrows original exception, propagating it upwards
}
Если вам нужна хорошая литература по этому поводу, Херб Саттер написал книгу под названием Exceptional C++
, и она охватывает безопасность исключений практическим и просветительским способом (imo). Определенно стоит проверить, хотите ли вы знать, когда и почему вам нужно выдавать исключения.
Надеюсь, это поможет!