Однако я начинаю думать, что, может быть, лучше просто позволить приложению немедленно взорваться при первой разыменовке нулевого указателя в той же функции - тогда файл аварийного дампа покажет, что произошло - и позволитВ процессе тщательного тестирования выявляются неправильные вызовы функций.
Если вы когда-нибудь задумывались об этом, вам следует вместо этого использовать assert()
.Таким образом, приложение гарантированно корректно завершит работу и сгенерирует дамп ядра.
Выдающееся исключение, которое не будет перехвачено, размотает стек, и диагностика (внутренней) проблемы позже может быть более сложной - если, конечно,вы будете внутри каждой функции, перехватывающей исключение, обогащая сообщение об ошибке правильной информацией, чтобы впоследствии разрешить локализацию проблемы.Но если вы уже обрабатываете исключения в такой степени, то нет смысла рассматривать ошибку как фатальную.
Для подобных случаев я лично предпочитаю использовать assert()
, сопровождаемый исчерпывающим модульным тестом.Обычные высокоуровневые тесты редко могут в достаточной степени охватить код.Для релизных сборок я отключаю assert()
s (используя -DNDEBUG
), как в производстве, в таких редких случаях клиенты обычно предпочитают модуль, который может работать с недостатком, но работает как-то и не падает.(Печальная реальность коммерческого программного обеспечения.)
Примечание: если код чувствителен к производительности, тогда утверждение может быть лучшим выбором.Вы можете отключить утверждения в сборках выпуска, но не можете удалить обработку исключений.
Подводя итог.Если NULL действительно не может произойти, используйте assert()
.Если у вас уже есть обработчик исключений, обработайте NULL как простую внутреннюю ошибку.
PS Еще одна концепция, касающаяся недопустимой обработки аргументов (редко реализуемая, но в прошлом я видел несколько реальных примеров), заключается в рефакторинге кода таким образом, чтобы исключить возможность возникновения недопустимых аргументов.Программное обеспечение жизнеобеспечения / критически важного / операторского уровня использует такие приемы проектирования, чтобы уменьшить накладные расходы на тестирование.