为什么 dart 中断言功能被禁用?

Pra*_*hra 2 assert dart

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");
}
Run Code Online (Sandbox Code Playgroud)

为了让这段代码正常工作,我必须使用“--enable-asserts”标签运行 dart 文件,并且在执行断言函数之前不传递“--enable-asserts”标签。为什么这个功能被禁用了?

jam*_*lin 5

什么是断言?

在包括 Dart 在内的许多语言中,“断言”专门用于捕获逻辑错误。(Dart 将这些称为Errors。)这些错误是由于编程错误造成的。这些类型的错误绝对不应该发生。从概念上讲,足够先进的静态分析器可以证明断言永远不会失败。在实践中,这样的分析很困难,因此出于实用性的考虑,在运行时验证断言。

这与运行时错误相反,运行时错误是程序实际运行时发生的不可预测的错误。(Dart 称之为Exceptions。)这些类型的错误通常是由于无效的用户输入造成的,但它们也包括文件系统错误和硬件故障等。

断言旨在用于在调试时验证假设(或捕获错误的假设),并且具有断言的编程语言通常允许在生产(非调试)代码中禁用它们。由于断言在逻辑上永远不应该发生,因此没有必要花费额外的运行时成本来检查它们。由于断言可以被禁用,这也应该进一步阻止错误地使用它们。

Dart 选择默认禁用断言,因此您必须选择将它们与--enable-asserts. 一些其他语言(例如 C)选择了选择退出系统。我不知道选择 Dart 的理由,但由于asserts 应该仅用于调试,所以对我来说,像 Dart 这样的语言(通常可能被解释)使用户更容易在生产中执行代码是有意义的模式。相反,对于像 C 这样的编译语言,启用或禁用断言的责任由开发人员而不是用户承担。

这对您的代码意味着什么?

您的代码未assert正确使用:您使用它来检查运行时输入。相反,应该是您始终执行的检查,如果失败,则会产生运行时错误:

if (evenNo % 2 != 0) {
  throw FormatException('wrong input');
}
Run Code Online (Sandbox Code Playgroud)