Метод handleError
Метод handleError класса Stream перехватывает ошибки,
возникающие в потоке, и позволяет обработать их с помощью
функции-обработчика. Первым параметром метод принимает функцию,
которая будет вызвана при возникновении ошибки. Вторым параметром
можно передать функцию-предикат test, которая определяет,
какие именно ошибки следует обрабатывать. Третьим параметром
можно передать функцию onDone, которая будет вызвана
при завершении потока. Метод возвращает новый поток, в котором
ошибки уже обработаны.
Синтаксис
Stream<T> handleError(Function onError, {bool test(dynamic error)?, void onDone()?})
Пример
Давайте создадим поток с ошибкой и обработаем её с помощью
метода handleError:
import 'dart:async';
void main()
{
StreamController<int> controller = StreamController<int>();
controller.stream
.handleError((error) {
print('Error: $error');
})
.listen((value) {
print('Value: $value');
});
controller.add(1);
controller.add(2);
controller.addError('Something went wrong');
controller.add(3);
controller.close();
}
Результат выполнения кода:
"Value: 1"
"Value: 2"
"Error: Something went wrong"
"Value: 3"
Пример
Давайте используем параметр test, чтобы обрабатывать
только определённые ошибки:
import 'dart:async';
void main()
{
StreamController<int> controller = StreamController<int>();
controller.stream
.handleError(
(error) {
print('Handled: $error');
},
test: (error) => error is String
)
.listen(
(value) {
print('Value: $value');
},
onError: (error) {
print('Unhandled: $error');
}
);
controller.add(1);
controller.addError('String error');
controller.addError(42);
controller.close();
}
Результат выполнения кода:
"Value: 1"
"Handled: String error"
"Unhandled: 42"
Пример
Давайте используем параметр onDone для выполнения
действия при завершении потока:
import 'dart:async';
void main()
{
StreamController<int> controller = StreamController<int>();
controller.stream
.handleError(
(error) {
print('Error: $error');
},
onDone: () {
print('Stream is done');
}
)
.listen((value) {
print('Value: $value');
});
controller.add(1);
controller.addError('Oops');
controller.close();
}
Результат выполнения кода:
"Value: 1"
"Error: Oops"
"Stream is done"