为何含assert()的Dart代码未抛出错误?
问题原因及解决办法
核心原因:Dart断言默认未启用
Dart的assert()语句默认仅在开发/调试模式下生效,默认运行的生产模式会直接跳过断言代码。所以你输入无效字符串时,age为null,但断言未触发,代码继续执行到后续打印语句。
验证断言的方法:启用断言运行
运行代码时添加--enable-asserts参数,命令示例:
dart run --enable-asserts your_script.dart
此时输入nnnnn,断言就会触发,抛出Assertion failed: "Age cannot be null"的错误。
更可靠的输入校验方式:不依赖断言
如果希望在任何运行模式下都能捕获无效输入,不要依赖assert(),改用条件判断主动抛出异常,这样能被你的catch块捕获:
void main(List<String> arguments) { print('Enter your age: '); try { int? age = int.tryParse(stdin.readLineSync()!); print('Age is $age'); if (age == null) { throw ArgumentError('Age cannot be null'); } print('You are $age years old'); } catch (e) { print('You gave us a bad age'); } }
修改后无论是否启用断言,输入无效内容都会进入catch块,输出预期的错误提示。
内容的提问来源于stack exchange,提问作者TheMexican
相关产品推荐
相关产品推荐

