gpt4 book ai didi

exception - 如何在 Dart 中通过 waitFor 抛出一个 future

转载 作者:行者123 更新时间:2023-12-03 04:25:29 25 4
gpt4 key购买 nike

我是 Dart dshell 包的作者。

https://pub.dev/packages/dshell

Dshell 是一个用于编写 dart cli 脚本的库和工具。

Dshell 使用 waitFor 向用户隐藏 future,因为它们在典型的 cli 应用程序中几乎没有用处。

我的问题是,如果 future 在由 waitFor 处理时抛出未处理的异常,它实际上会关闭应用程序。

我需要能够捕获任何异常,然后让调用者决定如何处理异常。

这是我到目前为止所尝试的。没有任何 catch 技术将捕获未处理的异常:

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;
}



dart waitFor 有一行让我认为这可能是不可能的:

If the Future completes normally, its result is returned. If the Future completes with an error, the error and stack trace are wrapped in an AsyncError and thrown. If a microtask or message handler run during this call results in an unhandled exception, that exception will be propagated as though the microtask or message handler was the only Dart invocation on the stack. That is, unhandled exceptions in a microtask or message handler will skip over stacks suspended in a call to waitFor.



所以我对“ future 完成但出现错误”和“微任务......导致未处理的异常”之间的区别有点困惑。

最佳答案

Future由您的 throwException 返回永远不会以值或错误完成。 Future.delayed 引发的错误是一个未处理的异步错误,它与 Future 完全无关从该方法返回的。获得以错误完成的 Future 的方法是:

  • Future.error构造函数。
  • 使用 Completer.completeError在尚未完成的 Completer .
  • 使用 throwasync方法。
  • 使用 throw在传递给 Future 的回调中构造函数,或 .then .

  • 所以在你的例子中, Future.delayed创建一个 Future由于 throw,这将完成并出现错误在回调中。没有人在听这个 future 。没有 await , 没有 .then.catchError锁住它。一旦 Future 以错误结束,并且它没有处理该错误的处理程序,它将冒泡到周围的错误区域。见 https://dart.dev/articles/archive/zones#handling-asynchronous-errors

    如果您希望能够对未处理的错误使用react,可以使用 runZoned - 获得正确的细节可能会很棘手。请注意,运行一些代码可能会导致多个未处理的异步错误,并且 Future 的完成并不一定意味着以后不会出现其他未处理的异步错误。

    关于exception - 如何在 Dart 中通过 waitFor 抛出一个 future ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59938829/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com