Re[15]: Необходимость ASSERT
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 19.10.05 12:42
Оценка:
Здравствуйте, 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>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.