#flutter #dart #exception #inheritance
Вопрос:
Я определяю некоторые пользовательские исключения в Dart.
Я хочу в своей логике проверить тип исключения и основывать свою обработку на этом, поэтому я хочу создать отдельные классы для каждого, например, как это :
class FailedToLoadCriticalDataException implements Exception { } // app cannot continue
class FailedToLoadNonCriticalDataException implements Exception { } // app can continue
Однако я также хочу передать 2 параметра при создании исключений этих типов, тип вызова API и URL-адрес API, а определение для этого будет выглядеть следующим образом :
class UrlCallFailedException implements Exception {
String _dataTypeName;
String _urlEndpoint;
UrlCallFailedException([this._dataTypeName, this._urlEndpoint]);
@override
String toString() {
return "(${this.runtimeType.toString()}) Failed to fetch $_dataTypeName ($_urlEndpoint)";
}
}
Теперь то, что я хочу сделать, это (заменить первоначальные определения, которые я сделал ранее, и повторно)определить мои FailedToLoadCriticalDataException
FailedToLoadNonCriticalDataException
классы и так, чтобы они были точно тем кодом, который находится в UrlCallFailedException
классе.
Есть ли какой-нибудь способ просто сказать что-то вроде class FailedToLoadCriticalDataException **is** UrlCallFailedException;
и не нужно дублировать код, который определяет UrlCallFailedException
?
class FailedToLoadCriticalDataException implements UrlCallFailedException{ }
неверно, потому что в нем «Отсутствуют конкретные реализации» исключения URL-адреса получателя._dataTypeName»,..»
class FailedToLoadCriticalDataException extends UrlCallFailedException{ }
это неправильно, потому что, когда я добрался до throw FailedToLoadNonCriticalDataException("Foo", url);
этого, ожидалось, что параметров нет («Слишком много позиционных аргументов: ожидается 0, но найдено 2»).
Есть ли способ создать несколько классов, которые ведут себя точно так же, как и другой тип, и отличаются только своим классом, без дублирования всего кода ?
Ответ №1:
Я придумал это как достойный компромисс :
class FailedToLoadCriticalDataException extends UrlCallFailedException {
FailedToLoadCriticalDataException([dataTypeName, urlEndpoint]) {
super._dataTypeName = dataTypeName;
super._urlEndpoint = urlEndpoint;
}
}
class FailedToLoadNonCriticalDataException extends UrlCallFailedException {
FailedToLoadNonCriticalDataException([dataTypeName, urlEndpoint]) {
super._dataTypeName = dataTypeName;
super._urlEndpoint = urlEndpoint;
}
}
Некоторое, но минимальное дублирование кода, и теперь я могу вызвать throw FailedToLoadNonCriticalDataException("Foo", url);
свой код позже.