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