Изучение
Выбор правильного пути обработки
Определите, относится ли ошибка к типизированному результату, локальному восстановлению, стандартному распространению или прикладной цепочке обработки.
Выбор правильного пути обработки
Ark Error Manager не является первым адресатом каждой ошибки. Большая часть приложения продолжает использовать обычные возвращаемые значения, типизированные отрицательные результаты, try/catch и стандартное распространение. Менеджер координирует меньший набор ErrorIncident, достигших границы приложения или явно требующих решения на уровне приложения.
Сначала определите вид результата
| Ситуация | Правильный путь | Причина |
|---|---|---|
| Валидация формы отклоняет ввод | Типизированное состояние валидации | Приложение ожидает такой результат. |
| Поиск не нашёл элементов | Пустой доменный результат | Исключительной ситуации не возникло. |
| Чтение необязательного кэша завершилось ошибкой, но Remote-загрузка доступна | Локальное восстановление; при необходимости — ограниченная диагностика | У операции есть допустимый запасной путь. |
| Repository не может завершить операцию, а политика повторов принадлежит вызывающему коду | Передача ошибки выше или типизированный отрицательный результат | Решение остаётся у локальной границы. |
| Необработанная асинхронная ошибка покинула задачу приложения | Корневая Zone | Ошибка достигла границы процесса. |
| Flutter сообщает об ошибке Build, Layout или Paint | Привязка FlutterError.onError | Точка перехвата уже принадлежит Flutter. |
| Дочерний Isolate завершился с необработанной ошибкой | Привязка к порту ошибок Isolate | Zone не пересекает границу Isolate. |
| Интеграционный код обязан поглотить исключение и вернуть запасной результат, но всё ещё требуется отчёт или восстановление | Один намеренный вызов handleError или captureError | Обычное распространение намеренно остановлено. |
У локального catch есть три честных исхода
try {
return await client.load();
} catch (error, stackTrace) {
// Выберите один основной путь:
// 1. восстановить операцию и вернуть обычный результат;
// 2. преобразовать ошибку или передать её вызывающему коду;
// 3. передать менеджеру один раз, потому что эта граница поглощает ошибку.
}
Локальное восстановление
Возвращайте запасной результат, только если домен считает его допустимым. Сам факт выполнения catch не является причиной для глобального отчёта.
Сохранение распространения
Используйте rethrow, если решение остаётся у вызывающего кода или корневой границы. Так сохраняется исходный StackTrace и не создаётся второй путь отчётности.
Намеренная передача
Используйте handleError, если локальная граница должна дождаться завершения отчёта, показа и восстановления. captureError подходит, когда достаточно поставить ErrorIncident в очередь. После передачи не отправляйте ту же ошибку через rethrow в другую настроенную границу без явного идентификатора и политики дедупликации.
Одна ошибка — одна передача на уровне приложения
Дубликаты обычно возникают так:
- функция перехватывает и передаёт ошибку менеджеру;
- затем снова выбрасывает её;
- Zone или обработчик Flutter перехватывает её повторно;
- сохранённый предыдущий обработчик Flutter отправляет её ещё в одну систему сбора сбоев.
Выберите одного владельца внешней отчётности. Если предыдущий обработчик необходимо сохранить, заранее определите, какая система отправляет данные наружу и как ErrorIncident сопоставляются или исключаются как дубликаты.
Где доступен ErrorManager
Менеджером владеет код инициализации или корень композиции. Он передаёт обратный вызов только инфраструктурным привязкам, которым менеджер действительно необходим. UseCase, Presenter, Repository, DataSource и виджеты сохраняют существующие контракты ошибок и не разрешают глобальный менеджер.
Поэтому рецепт намеренно обработанной ошибки — исключение для конкретной интеграционной границы, а не шаблон для каждого метода.
Что читать дальше
- «Владение и границы» — расположение менеджера.
- «Упорядоченная цепочка обработки» — действия после передачи.
- Корневая граница Dart или корневая интеграция Flutter — полная сборка.
- «Безопасность и конфиденциальность» — обязательный материал перед подключением удалённого
ErrorReporter.