Общее правило для исключений: "Заинтересован ли сайт немедленного вызова о том, что здесь происходит?" Если сайт вызова заботится, то возвращение кода состояния, вероятно, имеет смысл. В противном случае, метание имеет больше смысла.
Рассмотрим это следующим образом - конечно, у вашего метода rotate in place есть несколько недопустимых типов аргументов, и в этом случае вы, вероятно, должны выбросить std::invalid_argument
. Маловероятно, что вызывающий абонент rotate_in_place
хочет иметь дело или знает, как поступить, например, с изображением, которое не было квадратным, и поэтому это, вероятно, лучше выразить как исключение.
Еще одна возможность - не пытаться завернуть {} catch {} и позволить
выход из программы, но чем это отличается от использования
if (sz.nx != sz.ny) {
cerr << "Error: non-squared image error!\n";
exit(0);
}
Это другое, потому что если кто-то позже захочет взять вашу функцию и поместить ее, скажем, в приложение с графическим интерфейсом, ему не нужно завершать программу из-за ошибки. Они могут превратить это исключение в нечто симпатичное для пользователя или что-то в этом роде.
Это также имеет преимущества для вас прямо сейчас, а именно: вам не нужно вводить <iostream>
в эту единицу перевода просто для того, чтобы писать ошибки.
Я обычно использую шаблон примерно так:
int realEntryPoint()
{
//Program goes here
}
int main()
{
//Allow the debugger to get the exception if this is a debug binary
#ifdef NDEBUG
try
#endif
{
return realEntryPoint();
}
#ifdef NDEBUG
catch (std::exception& ex)
{
std::cerr << "An exception was thrown: " << ex.what() << std::endl;
}
#endif
}