Мы обсуждали эту тему сегодня на работе, и никто из нас не мог дать окончательного ответа на этот вопрос. Рассмотрим следующую ситуацию:
int foo()
{
int err;
err = some_call(1);
if (err != 0)
return err;
err = some_call(2);
if (err != 0)
return err;
err = some_call(3);
if (err != 0)
return err;
err = some_call(4);
if (err != 0)
return err;
bar();
return err;
}
Существует много повторений кода. Очевидно, что это может быть факторизовано с помощью макроса, к сожалению, не с шаблоном (из-за предложения return). Или, по крайней мере, не напрямую.
Теперь вопрос заключается в том, должны ли мы заменить те коды ошибок возврата с исключениями и сразу же перехватить эти исключения, являются ли компиляторы допустимыми и достаточно умными для обнаружения шаблона и вообще не исключают исключения?
Вот иллюстрация того, что я имею в виду:
int foo()
{
try
{
// some_call now throws a ErrorReturned exception that contains the error code upon failure.
some_call(1);
some_call(2);
some_call(3);
some_call(4);
}
catch (ErrorReturned& ex)
{
return ex.error_code();
}
bar();
return 0;
}
Теперь нет текущей проблемы с производительностью, и поэтому да, нам не нужно оптимизировать или даже заботиться об этом. Это больше понять, что делать компиляторам.
Короче, так ли это "хорошая" практика, и если да, могут ли компиляторы оптимизировать это, не исключая вообще исключения? (Предполагая, что конструкция исключения не имеет побочного эффекта)