1. 使用 try-catch 无法捕获 不使用 await 的 async 函数异常
不可以捕获。
Widget _buildTestAsyncAwaitButton() {
return ButtonWidget.primary("测试 async await", onTap: (){
try{
Log.i("TAG testAsyncFuncError() Pre");
testAsyncFuncError();
Log.i("TAG testAsyncFuncError() Back");
}on Exception catch (e) {
Log.e("TAG async await Error, e = $e");
Loading.toast("async await Error, errMsg = ${e.toString()}");
}
});
}
void testAsyncFuncError(){
Log.i("TAG futureErrorFunc() Pre");
futureErrorFunc();
Log.i("TAG futureErrorFunc() Back");
}
Future<String> futureErrorFunc() async{
return Future.error("Future Error");
}
运行日志如下 :
I/flutter (24918): INFO │ 💡 TAG testAsyncFuncError() Pre
I/flutter (24918): INFO │ 💡 TAG futureErrorFunc() Pre
I/flutter (24918): INFO │ 💡 TAG futureErrorFunc() Back
I/flutter (24918): INFO │ 💡 TAG testAsyncFuncError() Back
E/flutter (24918): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: Future Error
E/flutter (24918): dart:async/future.dart 376:46 new Future.error
E/flutter (24918): package:flutter_gacha/pages/test/test.dart 69:19 TestPage.futureErrorFunc
E/flutter (24918): package:flutter_gacha/pages/test/test.dart 64:5 TestPage.testAsyncFuncError
E/flutter (24918): package:flutter_gacha/pages/test/test.dart 53:9 TestPage._buildTestAsyncAwaitButton.<fn>
注意这里提示 : Unhandled Exception: Future Error, 说明异常没有被捕获成功, 日志也没有打印
TAG async await Error, e = xxx
2. 直接 try-catch 可以直接捕获使用 await 的 async 函数异常
try-catch 代码块不能捕获到异步异常,使用 await 关键字声明的同步调用,属于同步异常范围,可以通过 try-catch 捕获。
可以捕获。
Widget _buildTestAsyncAwaitButton() {
return ButtonWidget.primary("测试 async await", onTap: (){
try{
Log.i("TAG testAsyncFuncError() Pre");
// testAsyncFuncError();
testAsyncFuncError2();
Log.i("TAG testAsyncFuncError() Back");
}on Exception catch (e) {
Log.e("TAG async await Error, e = $e");
Loading.toast("async await Error, errMsg = ${e.toString()}");
}
});
}
Future<void> testAsyncFuncError2() async {
Log.i("TAG testAsyncFuncError2() Pre");
try{
await futureErrorFunc();
}catch(e, stack){
Log.e("TAG asyncFunc await Error, e = $e");
}
Log.i("TAG testAsyncFuncError2() Back");
}
运行日志如下 :
I/flutter ( 1767): INFO │ 💡 TAG testAsyncFuncError() Pre
I/flutter ( 1767): INFO │ 💡 TAG testAsyncFuncError2() Pre
I/flutter ( 1767): INFO │ 💡 TAG testAsyncFuncError() Back
I/flutter ( 1767): ERROR │ ⛔ TAG asyncFunc await Error, e = Future Error
I/flutter ( 1767): INFO │ 💡 TAG testAsyncFuncError2() Back
3. 子函数不使用 try-catch 捕获使用 await 的 async 函数异常, 将异常交给父函数捕获
可以捕获。
Widget _buildTestAsyncAwaitButton() {
return ButtonWidget.primary("测试 async await", onTap: (){
try{
Log.i("TAG testAsyncFuncError() Pre");
testAsyncFuncError3Parent();
Log.i("TAG testAsyncFuncError() Back");
}on Exception catch (e) {
Log.e("TAG async await Error, e = $e");
Loading.toast("async await Error, errMsg = ${e.toString()}");
}
});
}
void testAsyncFuncError3Parent() async {
Log.i("TAG testAsyncFuncError3() Pre");
try{
await testAsyncFuncError3();
}catch(e, stack){
Log.e("TAG asyncFunc await Error, e = $e");
}
Log.i("TAG testAsyncFuncError3() Back");
}
Future<void> testAsyncFuncError3() async {
Log.i("TAG testAsyncFuncError3() Pre");
await futureErrorFunc();
Log.i("TAG testAsyncFuncError3() Back");
}
Future<String> futureErrorFunc() async{
return Future.error("Future Error");
}
运行日志如下 :
I/flutter (10799): INFO │ 💡 TAG testAsyncFuncError() Pre
I/flutter (10799): INFO │ 💡 TAG testAsyncFuncError3() Pre
I/flutter (10799): INFO │ 💡 TAG testAsyncFuncError3() Pre
I/flutter (10799): INFO │ 💡 TAG testAsyncFuncError() Back
I/flutter (10799): ERROR │ ⛔ TAG asyncFunc await Error, e = Future Error
I/flutter (10799): INFO │ 💡 TAG testAsyncFuncError3() Back
网友评论