Существует два типа ошибок, которые я хотел бы проверить: инварианты и ошибки во время выполнения.
Инварианты - это вещи, которые всегда должны быть правдой, несмотря ни на что. Для тех, я использую утверждения. Такие вещи, как вы, не должны передавать мне нулевой указатель на выходной буфер, который вы мне даете. Это ошибка в коде, простая и простая. В отладочной сборке он будет утверждать и давать мне возможность исправить ошибку. В розничной сборке это приведет к нарушению доступа и создаст мини-накопитель (Windows, по крайней мере, в моем коде) или coredump (Mac/unix). Нет catch
, что я могу сделать это имеет смысл разобраться с разыменованием нулевого указателя. В Windows catch (...)
можно подавить нарушения доступа и дать пользователю ложное чувство уверенности в том, что все в порядке, когда они уже прошли ужасно, ужасно неправильно.
Это одна из причин, почему я пришел к выводу, что catch (...)
, как правило, код запах в C++ и единственное разумное место, где я могу думать, что присутствуя находится в main
(или WinMain
) прямо перед созданием ядра дамп и вежливо выйти из приложения.
Ошибки во время выполнения такие вещи, как «Я не могу записать этот файл из-за разрешений» или «Я не могу записать этот файл, потому что диск заполнен». Для таких видов ошибок бросание исключения имеет смысл, потому что пользователь может что-то с этим сделать, как изменить разрешение на каталог, удалить некоторые файлы или выбрать альтернативное местоположение для сохранения файла. Эти ошибки времени выполнения могут быть исправлены пользователем. Нарушение инварианта не может быть исправлено пользователем, только программистом. (Иногда два одинаковые, но обычно это не так.)
Ваши юнит-тесты должны заставить код выбросить ошибки во время выполнения, которые может генерировать ваш код. Вы также можете принудительно исключить исключения со своих сотрудников, чтобы убедиться, что ваша система находится в безопасности.
Однако я не верю, что есть смысл в попытке заставить ваш код утверждать против инвариантов с модульными тестами.
Я знаю, что это старая тема, но я добавил решение, которое я придумал, что помогло мне на работе. – grokus 2011-07-26 22:26:19