Что выбрасывает программа при краше (crash) в Dart?

«Что выбрасывает программа при краше (crash) в Dart?» — вопрос из категории Dart Core, который задают на 29% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

При необработанном исключении в Dart выбрасывается объект, унаследованный от класса Error или Exception, и выполнение потока прерывается.

Основные типы ошибок, которые я чаще всего вижу в логах:

  • RangeError (подкласс Error): Выход за границы коллекции.
    var list = [1, 2];
    print(list[5]); // RangeError (index): Invalid value: Not in range 0..1, inclusive
  • NoSuchMethodError (подкласс Error): Вызов метода или геттера у null или несуществующего члена.
    String? nullableString;
    print(nullableString.length); // NoSuchMethodError: The getter 'length' was called on null.
  • StateError: Нарушение инварианта объекта (например, вызов add на закрытом EventSink).

Обработка: Для глобального перехвата таких ошибок в Flutter-приложении я настраиваю:

void main() {
  FlutterError.onError = (details) {
    // Отправляем в Crashlytics/Sentry
    myCrashReportingTool.recordError(details.exception, details.stack);
  };
  PlatformDispatcher.instance.onError = (error, stack) {
    // Перехват ошибок вне контекста Flutter
    myCrashReportingTool.recordError(error, stack);
    return true; // Предотвращаем завершение изолятора
  };
  runApp(const MyApp());
}

Это позволяет логировать краши и, по возможности, gracefully завершать работу приложения.