美文网首页
Flutter 中 Future async await 与异常

Flutter 中 Future async await 与异常

作者: 李云龙_ | 来源:发表于2023-09-19 11:10 被阅读0次
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

相关文章

网友评论

      本文标题:Flutter 中 Future async await 与异常

      本文链接:https://www.haomeiwen.com/subject/ntmnvdtx.html