'的函数“runZoned”的目的;dart:async';

'的函数“runZoned”的目的;dart:async';,dart,dart-async,Dart,Dart Async,有一个特殊的函数runZoned,由dart:async提供。文件如下: 我不知道这个函数的用途是什么,我们什么时候需要它,以及如何正确使用它 看看这段代码: 导入'dart:async'; void main(){ catchError((s){},test:(e)=>e是字符串); badMethod().catchError((s){},test:(e)=>e是字符串); } 未来方法(){ 返回新的未来(()=>抛出“我很好”); } 未来方法(){ 新的未来(()=>抛出“我很坏”);

有一个特殊的函数
runZoned
,由
dart:async
提供。文件如下:

我不知道这个函数的用途是什么,我们什么时候需要它,以及如何正确使用它

看看这段代码:

导入'dart:async';
void main(){
catchError((s){},test:(e)=>e是字符串);
badMethod().catchError((s){},test:(e)=>e是字符串);
}
未来方法(){
返回新的未来(()=>抛出“我很好”);
}
未来方法(){
新的未来(()=>抛出“我很坏”);
返回新的未来(()=>抛出“我很好”);
}
输出

Unhandled exception:
I am bad
It's not so bad but good in this also not so big.
Problem still exists: I am bad
现在看看这段代码:

导入'dart:async';
void main(){
catchError((s){},test:(e)=>e是字符串);
运行分区(){
badMethod().catchError((s){},test:(e)=>e是字符串);
},onError:(s){
打印(“它不是很差,但在这方面很好,也不是很大。”);
打印(“问题仍然存在:$s”);
});
}
未来方法(){
返回新的未来(()=>抛出“我很好”);
}
未来方法(){
新的未来(()=>抛出“我很坏”);
返回新的未来(()=>抛出“我很好”);
}
输出

Unhandled exception:
I am bad
It's not so bad but good in this also not so big.
Problem still exists: I am bad
如果可能的话,您应该严格避免使用
badMethod

只有在不可能的情况下,您才可以临时使用
runZoned


您还可以使用
runZoned
模拟任务的
沙盒执行。

添加此功能是为了弥补其他有用功能的不足。只有当您需要(想要?)捕获无法修改的代码中的错误时,它才有用。也就是说,如果您希望处理在异步操作中引发未预期异常的代码,那么它非常有用。
runZoned
可以捕获由于源代码中的错误而无法捕获的这些未观察到的异常。对我来说,最好不要使用抛出未观察到的异常的代码,而不要在
runZoned
环境中运行带有已知bug的代码。缺少其他有用功能:async/await当编译器支持
async/await
操作时,它(或其他工具)可以通过异步操作检测源代码中的潜在错误。在这种情况下,它可以为程序员生成警告。在这种情况下,如果使用
async/await
操作编程约定编写的程序不包含可能导致未观察到的异常的明显潜在错误,则通常不需要
runzone
。事实上,
runZoned
是异步代码中遗漏(未观察到)的异常的
强制陷阱,由于源代码编写不当,这些异常在物理上不可能被捕获。