Должен ли я:Должен ли я вернуться после подтверждения Assert?
void func(some* ptr)
{
ASSERT(ptr);
ptr->do();
}
или
void func(some* ptr)
{
if (ptr == NULL)
{
ASSERT(0);
return;
}
ptr->do();
}
P.S. assert
- это наша домашняя версия, а не стандартная.
Это версия без возврата и становится noop
в режиме производства.
Я предпочитаю первый, код проще, короче и без лишнего кода здесь.
Но с первым, я могу только обнаружить ошибку во время разработки.
Конечно, я должен убить все ошибки во время разработки, но если какие-то непроверенные случаи произойдут после выхода в Интернет, то есть ptr
действительно станет NULL
, то func
не удалось.
Таким образом, преимущество второй части заключается в том, что я могу обнаруживать ошибки и гарантировать отсутствие сбоев как в режимах разработки, так и в производстве.
Но недостатком является то, что этот код выглядит грязным и становится ненужным, если бы у нас никогда не было ptr == NULL
.
В какой форме следует использовать?
Я настоятельно рекомендую использовать другое имя, кроме 'assert', для нестандартного варианта' assert'. Рассмотрим, например, использование 'ASSERT()' или 'Assert()'. Если вы хотите провести тест во время выполнения, используйте вариант второй версии (завернутый в подходящий макрос) с кодом, который регистрирует нарушение инварианта как можно подробнее (стек backtrace?) В подходящий постоянный журнал файл, из которого вы можете получить информацию позже. Но если вы считаете, что этот инвариант нарушен во время выполнения, вам нужно проверить его и обработать - это уже не регулярный 'assert()'. –
Спасибо Джонатан, это на самом деле 'ASSERT' в нашем проекте, это моя опечатка, поистине извините за это. –