Использование утверждений против исключений бросания?

Часто, когда я пишу функции, я хочу убедиться, что входные данные для него действительны, чтобы как можно раньше обнаружить такие ошибки (я считаю, что они называются предварительными условиями). Когда предварительное условие терпит неудачу, я всегда вызывал исключение. Но я начинаю сомневаться в том, что это лучшая практика, и если бы не утверждения были бы более уместными.

Итак, когда мне следует делать: когда целесообразно использовать утверждение и когда целесообразно выкинуть исключение?

31 голос | спросил gablin 29 +04002010-10-29T13:01:25+04:00312010bEurope/MoscowFri, 29 Oct 2010 13:01:25 +0400 2010, 13:01:25

4 ответа


42

Утверждения должны использоваться только для проверки условий, которые должны быть логически невозможны , чтобы быть ложными (читай: проверки работоспособности). Эти условия должны основываться только на входах, генерируемых вашим собственным кодом. Любые проверки, основанные на внешних входах, должны использовать исключения.

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

ответил Note to self - think of a name 29 +04002010-10-29T13:18:56+04:00312010bEurope/MoscowFri, 29 Oct 2010 13:18:56 +0400 2010, 13:18:56
23

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

Исключения, с другой стороны, предназначены для ситуаций, которые могут произойти, даже когда программа идеальна; они вызваны внешними влияниями, такими как аппаратные средства, сеть, пользователи и т. д.

ответил user281377 29 +04002010-10-29T13:04:22+04:00312010bEurope/MoscowFri, 29 Oct 2010 13:04:22 +0400 2010, 13:04:22
2

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

Например, в C,

int printf(const char *fmt, ...)
{
  assert(fmt);  // may fail in debug build but not in production build
  if (!fmt) return -1; // handle gracefully in production build
  ...
}

Исключения должны быть встроены в производственные сборки. Альтернативой для исключения является возврат ошибки, а не утверждений.

ответил aufather 29 +04002010-10-29T14:06:21+04:00312010bEurope/MoscowFri, 29 Oct 2010 14:06:21 +0400 2010, 14:06:21
0

Одна проблема с утверждениями для меня в том, что они по умолчанию отключены в Java.

Мы используем стратегию fail-first, в которой программа, которая, возможно, работала без присмотра в течение многих лет, должна как можно раньше свернуть, чтобы избежать повреждения данных в случае плохих данных (в неожиданной форме). Это то, что мы используем для проверки, и, используя утверждения, мы в основном рискуем, что они не будут активными.

ответил 29 +04002010-10-29T14:03:20+04:00312010bEurope/MoscowFri, 29 Oct 2010 14:03:20 +0400 2010, 14:03:20

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132