почему функция assert была отключена в dart? - PullRequest
0 голосов
/ 15 апреля 2020
import 'dart:io';
main() {
  print("Enter an even number : ");
  int evenNo = int.parse(stdin.readLineSync());
  assert(evenNo % 2 == 0, 'wrong input');
  print("You have entered : $evenNo");
}

, чтобы заставить этот код работать должным образом, мне пришлось запустить файл dart с тегом '--enable-asserts' и перед выполнением функции assert без передачи тега --enable-asserts. почему эта функция была отключена?

1 Ответ

3 голосов
/ 15 апреля 2020

Что такое утверждение?

Во многих языках, включая Dart, «утверждения» специально предназначены для отлова логических ошибок. (Дарт называет их Error с.) Это ошибки, которые произошли из-за ошибки программирования. Эти типы ошибок не должны возникать никогда . Концептуально, достаточно продвинутый анализатор состояния c может доказать, что утверждения никогда не потерпят неудачу. На практике такой анализ сложен, поэтому утверждения проверяются во время выполнения с практической точки зрения.

Это в отличие от ошибок runtime , которые являются непредсказуемыми ошибками, возникающими при выполнении программы. на самом деле работает. (Дарт называет их Exception с.) Часто эти типы ошибок происходят из-за неправильного ввода данных пользователем, но среди прочего они включают в себя ошибки файловой системы и аппаратные сбои.

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

Дарт решил оставить утверждения отключенными по умолчанию, поэтому вы должны отказаться от использования их с --enable-asserts. Некоторые другие языки (например, C) вместо этого выбрали систему отказа. Я не знаю обоснования этого выбора для Dart, но поскольку assert s следует использовать только для отладки, для меня имеет смысл, что такой язык, как Dart (который часто может интерпретироваться), облегчает выполнение пользователями код в производственном режиме. Напротив, для скомпилированных языков, таких как C, ответственность за включение или отключение утверждений возлагается на разработчика , а не на пользователя.

Что это означает для вашего кода?

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

if (evenNo % 2 != 0) {
  throw FormatException('wrong input');
}
...