Я являюсь автором пакета Dart dshell.
https://pub.dev/packages/dshell
Dshell - это библиотека и инструмент для написания сценариев dart cli.
Dshell использует waitFor, чтобы скрыть фьючерсы от пользователей, поскольку они мало используются в типичном приложении cli.
Моя проблема в том, что если в будущем выдается необработанное исключение во время обработки waitFor, оно по существу закрывает приложение вниз.
Мне нужно иметь возможность захватить любое исключение, а затем позволить вызывающему абоненту решить, что делать с этим исключением.
Вот то, что я пробовал до сих пор. Ни одна из техник улова не уловит необработанное исключение:
import 'dart:async';
import 'dart:cli';
void main() {
var future = throwException();
try {
future
.catchError((Object e, StackTrace st) => print('onErrr: $e'))
.whenComplete(() => print('future completed'));
print(waitFor<int>(future));
} // on AsyncError
catch (e) {
if (e.error is Exception) {
print(e.error);
} else if (e is AsyncError) {
print('Rethrowing a non DShellException ${e}');
rethrow;
} else {
print('Rethrowing a non DShellException ${e}');
rethrow;
}
} finally {
print('waitForEx finally');
}
}
Future<int> throwException() {
var complete = Completer<int>();
Future.delayed(Duration(seconds: 2), () => throw Exception());
return complete.future;
}
У дротика waitFor есть строка, заставляющая меня думать, что это может быть невозможно:
Если Будущее завершится нормально , его результат возвращается. Если Future завершается с ошибкой, ошибка и трассировка стека помещаются в AsyncError и выбрасываются. Если микропроцессор или обработчик сообщений, запущенный во время этого вызова, приводит к необработанному исключению, то это исключение будет распространяться так, как если бы микротак или обработчик сообщений был единственным вызовом Dart в стеке. То есть необработанные исключения в микрозадаче или обработчике сообщений будут пропускать стеки, приостановленные при вызове waitFor.
Так что меня немного смущает различие между «Будущее завершается с ошибкой» и «микрозадача ... приводит к необработанному исключению».