2013-11-18 4 views
1

Должен ли я:Должен ли я вернуться после подтверждения 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.

В какой форме следует использовать?

+2

Я настоятельно рекомендую использовать другое имя, кроме 'assert', для нестандартного варианта' assert'. Рассмотрим, например, использование 'ASSERT()' или 'Assert()'. Если вы хотите провести тест во время выполнения, используйте вариант второй версии (завернутый в подходящий макрос) с кодом, который регистрирует нарушение инварианта как можно подробнее (стек backtrace?) В подходящий постоянный журнал файл, из которого вы можете получить информацию позже. Но если вы считаете, что этот инвариант нарушен во время выполнения, вам нужно проверить его и обработать - это уже не регулярный 'assert()'. –

+0

Спасибо Джонатан, это на самом деле 'ASSERT' в нашем проекте, это моя опечатка, поистине извините за это. –

ответ

1

Вторая версия фактически не обнаруживает ошибок в производственной версии. Он возвращается беззвучно, вызывая всевозможные трудности для диагностики хаоса. Если вы хотите обнаружить утверждения о сбоях в производстве, включите их в производство.

2

Если вы хотите проверить ошибки в производстве, я предлагаю не использовать что-то, что становится noop в режиме производства. Вы должны решить, хотите ли вы сохранить циклы в производстве и устранить утверждения, или оставить их и испытать небольшой удар производительности. Нет никакого компромисса, это либо - или.

Таким образом, вы должны использовать первую форму; вторая форма является странной, грязной и не делает то, что вы думаете, что она делает. Вы должны использовать макрос вместо функции, так что если вы решите отключить их, даже вызов функции не останется; вызов функции noop еще требует времени.

Наконец, я должен спросить: в чем причина использования домашнего assert? Оригинальное утверждение уже включает возможность switching it off.

+0

Привет: домохозяйка делает некоторые выходные данные журнала в файлах, и мы используем макрос, а не функцию, извините за то, что не написал его четко. –

Смежные вопросы