Dart:
Обработка ошибок
Как:
Dart поддерживает два типа ошибок: ошибки времени компиляции и ошибки времени выполнения. Ошибки времени компиляции обнаруживаются анализатором Dart до выполнения кода, в то время как ошибки времени выполнения, или исключения, возникают во время выполнения. Вот как обрабатывать исключения в Dart:
Try-Catch
Используйте try-catch
для перехвата исключений и предотвращения их сбоев в вашем приложении:
try {
var result = 100 ~/ 0; // Попытка деления на ноль, вызывает исключение
} catch (e) {
print('Перехвачено исключение: $e'); // Обрабатывает исключение
}
Пример вывода: Перехвачено исключение: IntegerDivisionByZeroException
Конкретное Исключение
Для обработки конкретных исключений укажите исключение после catch
:
try {
var result = 100 ~/ 0;
} on IntegerDivisionByZeroException {
print('Нельзя делить на ноль.'); // Специально обрабатывает исключения при делении на ноль
}
Пример вывода: Нельзя делить на ноль.
Стек Вызовов
Чтобы получить стек вызовов для отладки, используйте второй параметр в блоке catch:
try {
var result = 100 ~/ 0;
} catch (e, s) {
print('Исключение: $e');
print('Стек вызовов: $s'); // Выводит стек вызовов для отладки
}
Finally
Используйте finally
для выполнения кода после try/catch, независимо от того, было ли выброшено исключение:
try {
var result = 100 ~/ 0;
} catch (e) {
print('Перехвачено исключение: $e');
} finally {
print('Это выполняется всегда.'); // Код очистки или завершающие шаги
}
Пример вывода:
Перехвачено исключение: IntegerDivisionByZeroException
Это выполняется всегда.
Сторонние Библиотеки
Хотя основная библиотека Dart надежна для обработки ошибок, вы также можете использовать сторонние пакеты, такие как dartz
для функционального программирования, которые вводят концепции, такие как Either
и Option
, которые могут быть использованы для обработки ошибок. Вот пример использования dartz
для обработки ошибок:
- Добавьте
dartz
в файлpubspec.yaml
в раздел зависимостей:
dependencies:
dartz: ^0.10.0
- Используйте
Either
для изящной обработки ошибок в вашем коде Dart:
import 'package:dartz/dartz.dart';
Either<String, int> divide(int dividend, int divisor) {
if (divisor == 0) {
return Left('Нельзя делить на ноль.');
} else {
return Right(dividend ~/ divisor);
}
}
void main() {
final result = divide(100, 0);
result.fold(
(left) => print('Ошибка: $left'),
(right) => print('Результат: $right')
);
}
Пример вывода: Ошибка: Нельзя делить на ноль.
Часть Left
обычно представляет ошибку, а часть Right
- успех. Этот шаблон позволяет обрабатывать ошибки более функциональным способом, обеспечивая ясность и контроль над управлением ошибками.