dart: как поймать ошибку типа во время компиляции

#dart

#dart

Вопрос:

Приведенный ниже код выдает ошибку времени выполнения.

TypeError: Instance of 'FormatException': type 'FormatException' is not a subtype of type 'CustomException'

Test(e) Почему не происходит сбой при компиляции, поскольку тип e является Exception и ожидается CustomException . Как обеспечить его соблюдение, чтобы туда нельзя было пройти Exception .

 abstract class CustomException implements Exception {
  String get code;
}

class Test {
  final CustomException ex;
  Test(this.ex);
}

void main() {
  try {
    throw new FormatException();
  } on Exception catch (e) {
    final t = Test(e);
    print('message: $t');
  }
}
  

Комментарии:

1. Отключить неявные приведения: dart.dev/guides/language/ …

2. @jamesdlin это здорово и, похоже, работает. Получил много неявных ошибок приведения и проверит рефакторинг всего. Пожалуйста, также сделайте это ответом, чтобы я мог принять. Спасибо.

Ответ №1:

Dart имеет (на данный момент) неявные понижения от супертипа к подтипу. Вам разрешено использовать выражение, которое является супертипом фактического требуемого типа, при условии, что вы знаете, что делаете.

Здесь у вас есть значение со статическим типом Exception ( e которое было перехвачено), и вы передаете его конструктору, требующему a CustomException , который является подтипом Exception . Язык позволяет это, но вставляет пониженное значение во время выполнения (эквивалентно e as CustomException ). Это приведение завершается неудачно, потому что значение на самом деле равно a FormatException .

С появлением функции безопасности null неявные понижения будут удалены, за исключением from dynamic (потому dynamic что в любом случае отключает статические проверки типов). Когда это происходит, Test(e) вызов становится недействительным. До тех пор этот код компилируется и завершается сбоем во время выполнения.

До тех пор вы можете заставить анализатор предупреждать вас о неявных вызовах, настроив его в analysis_options.yaml файле