Future.catchError 的错误处理程序必须返回 future 类型的值

问题描述 投票:0回答:1

这会产生运行时错误。

Future<int> nuclearPlant() async {
  await Future.delayed(Duration(seconds: 1));
  throw "up";
  return 999999999;
}
Future<void> main() async {
  final zillionVolts = await nuclearPlant().catchError((e) => "0");
  print(zillionVolts);
  print("Done, safely shutdown the plant.");
}

Future.catchError 的错误处理程序必须返回一个值 未来的类型

我同意这个错误。但为什么它是一个运行时?不是编译器错误吗?如何启用 linter 分析检查以防止包含此内容的代码?

在上面的关键代码示例中,有人在迁移 2.0 期间错误地将 0 作为 String。结果,发电厂并没有关闭造成大规模破坏,因为

Dart
允许该代码在生产中运行。

flutter dart error-handling compiler-errors static-analysis
1个回答
0
投票

这是您需要的规则:https://dart.dev/tools/diagnostic-messages?utm_source=dartdev&utm_medium=redir&utm_id=diagcode&utm_content=invalid_return_type_for_catch_error#invalid_return_type_for_catch_error

默认情况下它具有

warning
级别,以下是强制其为
error
的方法:

analyzer:
  errors:
    invalid_return_type_for_catch_error: error

重要提示:您必须在代码上运行

dart analyze
,因为规则本身不会破坏
flutter build
flutter run
命令。基于此,你实际上有 2 个选择:

  1. 将这条规则强制执行到
    error
    ,就像我之前说的,然后在 CI 管道中运行
    dart analyze
  2. 请勿对
    analysis_options.yaml
    进行任何更改,然后运行
    dart analyse --fatal-infos --fatal-warnings
    – 这样您将获得最干净的代码。

我个人更喜欢第二种选择。

© www.soinside.com 2019 - 2024. All rights reserved.