Расширение класса 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...
}
Другие вопросы по тегам