Конечно, один вопрос - зачем вам писать такой код? Очевидный ответ на этот вопрос заключается в том, что AlwaysTrows () на самом деле является функцией сообщения об ошибках некоторого вида. В моем собственном коде я фактически использую макрос для создания отчетов об ошибках, потому что он позволяет мне выполнять форматирование строк и получать макросы standatd __LINE__
и __FILE__
. Макрос выглядит примерно так:
#define ATHROW( msg ) \
{ \
std::ostringstream os_; \
os_ << msg; \
throw ALib::Exception( os_.str(), __LINE__, __FILE__ ); \
}
, где конструктор исключений выполняет дополнительное форматирование, дополнительное ведение журнала и т. Д. Побочный эффект этого, конечно, заключается в том, что компилятор может видеть, что генерируется исключение, поэтому, когда я говорю что-то вроде:
int f() int val ) {
if ( val >= BADVALUE ) {
ATHROW( "Invalid value " << val << " for val" );
}
else {
return val / 3;
}
}
тогда я не получу предупреждение о том, что f () не возвращает значение.