Здравствуйте, Sinclair, Вы писали:
E>>Имхо, самая большая проблема ASSERT-ов это то, что они выбрасываются из production кода. Абыдна бывает получать в production ошибку в функции RegisterUser (или даже в дебрях SaveToDb) из-за того, что где-то выше один из szFirstName, szLastName получился нулевым.
S>Нет. Если там стоял ассерт, то ты получил ошибку из-за того, что test coverage был неполным. А если он был неполным, то нефиг выкидывать ассерты из продакшна.
Это в пределе. К которому нужно стремиться.
E>>Благодоря ASSERT-ам мы теряем возможность быстро продиагностировать проблему.
S>А что, без ассерта ты имел какую-то возможность быстро продиагностировать проблему? Расскажи мне, что это за замечательная возможность. Я тоже хочу ей пользоваться.
Да все просто. Вместо ASSERT-а, который исчезает с NDEBUG делаешь простые проверки с abort-ом или порождением исключения. Эти проверки остаются в production системе.
int RegisterUser(char * szFirstName, char* szLastName)
{
if( !szFirstName )
abort_program( "RegisterUser: szFirstName == NULL" );
if( !szLastName )
abort_program( "RegisterUser: szLastName == NULL" );
if(strlen(szLastName) == 0) // а вот тут уже пользовательский ввод
{
return -1; // возвращаем код ошибки, чтобы вызывающий код мог отразить это в интерфейсе
}
return SaveToDb(szFirstName, szLastName);
}
... << RSDN@Home 1.1.4 stable rev. 510>>