Недавно я увидел, что библиотека boost_options boost выбрасывает logic_error
, если вход в командную строку не был разбор. Это оспаривало мои предположения о logic_error
vs. runtime_error
.
Я предположил, что логические ошибки (logic_error
и его производные классы) были проблемами, возникшими в результате внутренних сбоев в привязке к программным инвариантам, часто в форме незаконных аргументов для внутренних API. В этом смысле они в значительной степени эквивалентны ASSERT, но предназначены для использования в выпущенном коде (в отличие от ASSERT, которые обычно не скомпилированы в выпущенный код). Они полезны в ситуациях, когда невозможно интегрировать отдельные программные компоненты в сборки отладки/тестирования или последствия сбоя таковы, что важно дать пользователю информацию о недействительном состоянии инварианта во время выполнения.
Аналогично, я думал, что runtime_error
приведен исключительно из условий выполнения вне контроля программиста: ошибки ввода-вывода, неправильный ввод пользователя и т.д.
Тем не менее, program_options, очевидно, сильно (в первую очередь?) используется как средство разбора входных данных конечного пользователя, поэтому в моей ментальной модели, безусловно, следует выбросить runtime_error
в случае плохого ввода.
Где я ошибаюсь? Согласны ли вы с форсированной моделью ввода исключений?