#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
файле