Расширение класса Exception в Dart
Я продолжаю получать сообщение об ошибке, когда пытаюсь расширить класс Exception, и не могу понять, почему. Вот код для моего пользовательского исключения:
class MyException extends Exception {
String msg;
MyException(this.msg);
String toString() => 'FooException: $msg';
}
Ошибка разрешается вокруг конструктора. Он жалуется, что "Генерирующий конструктор" Исключение ([динамическое сообщение]) -> Исключение "ожидается, но фабрика найдена". Как это исправить?
2 ответа
Вы почти правы. Вам нужно реализовать исключение, а не расширять его. Это должно работать:
class MyException implements Exception {
final String msg;
const MyException(this.msg);
String toString() => 'FooException: $msg';
}
Вам не нужно делать msg
финал или конструктор const
, но вы можете. Вот пример реализации класса Exception (из библиотеки dart: core):
class FormatException implements Exception {
/**
* A message describing the format error.
*/
final String message;
/**
* Creates a new FormatException with an optional error [message].
*/
const FormatException([this.message = ""]);
String toString() => "FormatException: $message";
}
Я хотел бы добавить к другому ответу: было бы полезно иметь не только строку сообщения.
type
или
code
поэтому вызывающий может решить, что делать, в зависимости от типа исключения. Например:
enum NfcErrorType { communication, parse, timeout, mismatch }
class NfcException implements Exception {
final NfcErrorType type;
NfcException(this.type);
@override
String toString() {
return 'NfcException: $type';
}
}
Тогда вы можете бросить вроде:
throw NfcException(NfcErrorType.parse);
И вызывающий может поймать так:
try {
// ...
} on NfcException catch (err) {
switch(err.type) {
case NfcErrorType.parse:
// do something
break;
case NfcErrorType.communication:
// do something different
break;
// .... other cases
}
} catch(err) {
// handle some other way...
}