Asynchronous 什么';错误和掷镖未来的区别是什么?

Asynchronous 什么';错误和掷镖未来的区别是什么?,asynchronous,dart,future,Asynchronous,Dart,Future,我想了解在异步函数中何时使用throw和return Future.error。在选择其中一个时,我们是否应该考虑到任何潜在的差异 我做了一个小测试: Future testFuture()异步{ 返回Future.error(“来自Future的错误”); } void testThrow(){ 抛出(“抛出错误”); } Future testfuturarrow()异步{ 抛出(“来自未来抛出的错误”); } main()异步{ 打印(“将运行测试”); 试一试{ 等待测试未来(); }

我想了解在异步函数中何时使用
throw
return Future.error
。在选择其中一个时,我们是否应该考虑到任何潜在的差异

我做了一个小测试:

Future testFuture()异步{
返回Future.error(“来自Future的错误”);
}
void testThrow(){
抛出(“抛出错误”);
}
Future testfuturarrow()异步{
抛出(“来自未来抛出的错误”);
}
main()异步{
打印(“将运行测试”);
试一试{
等待测试未来();
}
捕获(e){
印刷品(e);
}
试一试{
testThrow();
}
捕获(e){
印刷品(e);
}
试一试{
等待测试行();
}
捕获(e){
印刷品(e);
}
testFuture().catchError((e)=>print(e));
testfuturarrow().catchError((e)=>print(e));
打印(“确实运行了测试”);
}
他们似乎都是以同样的方式工作的。这是输出:

will run test
error from future
error from throw
error from future throw
did run test
error from future
error from future throw
从这个测试中我们可以看到,从调用者的角度来看,当使用
try/catch
调用函数时,代码运行是同步的,如果我们
Future.catchError
它是异步的。但从功能流的角度来看,它似乎是相同的

注:我最初的回答是一个问题。但后来我意识到我不是在回答,而是在做一个问题


我的经验是,如果要使用
myFunc().then(processValue).catchError(handleError)应该返回Future.error,但不要抛出它

异步等待是一种语言扩展/语法糖,通过恢复同步方式简化异步代码的使用

这两种方法都将直接使用期货,使此代码类似:

//在被叫方
未来调用同步()异步{
返回“来自异步被调用方”;
}
未来调用同步(){
返回Future.value(“来自同步被调用方”);
}
//在调用方一侧
未来调用同步()异步{
打印(“got${await calleesync()}”);
打印(“got${await calleeSync()}”);
}
void callerSync(){
calleeAsync()
。然后((v)=>打印(“got3$v”))
.然后(()=>calleeSync())
。然后((v)=>打印(“got4$v”);
}
(在callerSync中,第二个
then()
的回调可以与第一个的回调合并,第三个
then()
的回调也可以直接附加到
calleeSync()
,因为它具有单子式的关联性)

同样,这些功能是等效的:

//在被叫方
未来调用同步()异步{
抛出“异步错误”;
}
未来调用同步(){
返回Future.error(“同步错误”);
}
//在调用方一侧
未来调用同步()异步{
试一试{
等待调用同步();
}捕获(e){
打印(“捕获$e”);
}
试一试{
等待调用同步();
}捕获(e){
打印(“捕获$e”);
}
}
void callerSync(){
calleeAsync()
.catchError((e)=>打印(“捕获的$e”))
.然后(()=>calleeSync())
.catchError((e)=>打印(“捕获的$e”);
}

总之,没有实际区别<代码>返回未来。错误(…)
根本没有利用异步函数提供的扩展,因此更像是混合了两种异步代码。

你找到答案了吗?@brendan不,我没有。因为我在正常工作中不使用dart,所以我忽略了这一点,因为很长时间没有人回复。谢谢@Fan101的回答。我的问题正是因为我是从这个假设开始的。但是在做一些简单的测试(初始问题中的代码)时,不清楚您所展示的是否是唯一/正确的方法。这是根据指南还是有其他考虑?我想我误解了你最初的问题。如果你问为什么
testFuture().catchError((e)=>print(e));testfuturarrow().catchError((e)=>print(e))
异步运行,因为您在
try catch
块中有wait语句,但在
Future.catchError
语句中没有。至于我在上一篇文章中回答的原因,我在做颤振应用程序项目时遇到了这个问题
Future.catchError
如果您抛出错误,它将无法捕获错误。我也很好奇为什么它能在飞镖垫上工作,但不能在颤振上工作。