Это дает ошибку времени выполнения.
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 должен возвращать значение тип будущего
Я согласен с ошибкой. Но почему это рантайм?? Это не ошибка компилятора? Как включить проверку линтер-анализа, чтобы код не содержал это?
В приведенном выше критическом примере кода кто-то по ошибке указал 0 в качестве строки во время миграции 2.0. В результате электростанция не остановилась, вызвав массовые разрушения, поскольку Dart
позволил этому коду работать в производстве.
1. Как отмечено в ответе Sameri11, я получаю предупреждение invalid_return_type_for_catch_error
во время компиляции для приведенного выше кода. 2. Не используйте catchError
. Если вы используете try
-catch
с async
-await
, вы получите ошибку invalid_assignment
.
Вот правило, которое вам нужно: 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 варианта:
error
, как я уже говорил ранее, а затем запустите dart analyze
в своем конвейере CI.analysis_options.yaml
, а запустите dart analyze --fatal-infos --fatal-warnings
— так вы получите максимально чистый код.Я лично предпочитаю второй вариант.
Для тех, кто живет в США, это dart analyze
вместо dart analyse
.
Ржу не могу! Я исправил, спасибо :)
Я думаю, что это предложение — то, что вам нужно, поэтому, пожалуйста, проголосуйте за него: github.com/dart-lang/sdk/issues/54946