在 Dart 中将异常从异步方法向上传递到同步方法

Posted

技术标签:

【中文标题】在 Dart 中将异常从异步方法向上传递到同步方法【英文标题】:Passing Exceptions up the stack in Dart from async to sync methods 【发布时间】:2019-05-17 23:20:25 【问题描述】:

因此,来自 javascript 世界,我可以处理无论在堆栈深处抛出的异常。在 Dart 中做同样的事情是行不通的。我不确定如何向上传递异常,以便在堆栈的根部进行处理。

willThrow() async 
    throw Exception('Im an exception');


init() async 
    final illNeverExist = await willThrow();
    print(illNeverExist);


main() 
  try 
    init();
   catch(err) 
    print(err);
  

^^^ 这完全适用于 javascript。

在“init”中,即使我将其包装在 try catch 中并抛出该错误,我总是会得到一个未捕获的异常。

init() async 
    try 
        final illNeverExist = await willThrow();
        print(illNeverExist);
     catch(err) 
        throw err
    

如何在 dart 中将异步异常向上传递?!

【问题讨论】:

你需要制作mainasync并使用await init();(或直接使用Future.catchError)。 你是对的!那行得通。 b的儿子。谢谢!如果这是一个答案,我会这样标记它! 【参考方案1】:

main 函数中的 try-catch 块不会等待异步 init 函数完成。因此,当init 完成时,将不再捕获其异常。

你可以通过mainasyncawait init();来解决这个问题,或者你可以使用Future.catchError直接在返回的Future上注册一个错误回调。

【讨论】:

以上是关于在 Dart 中将异常从异步方法向上传递到同步方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在 GWT RPC 中将异常从服务器传递到客户端

C#中异步编程多个异常的处理方式

Dart 中的 stdout.write() 显然已从同步更改为异步,但我该如何使用它呢?

异步请求的数据,并将数据赋值给全局变量的一些解决方法

异步编程之 Streams

FlutterFuture 异步编程 ( 简介 | then 方法 | 异常捕获 | asyncawait 关键字 | whenComplete 方法 | timeout 方法 )