You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dart中try catch无法捕获含rethrow函数的异常问题排查

问题原因及解决方案

核心问题:未正确处理异步方法的异常

room.connect是异步方法(返回Future),你在initState中直接调用而未使用await,导致同步的try/catch无法捕获异步抛出的异常。异步代码的异常会在独立的事件循环中触发,不在当前同步执行栈范围内,所以外层的try/catch无法捕获到。

库中的rethrow本身没有限制,它只是将捕获到的异常重新抛出,但因为你没有等待异步操作完成,这个异常最终会成为未捕获的异步异常,导致调试器停在库的rethrow处。

修复代码

修改initState,通过异步方式调用room.connect并使用await,让try/catch能捕获到异步异常:

@override
void initState() {
  super.initState();
  print('initializing');
  _connectToRoom();
}

// 单独的异步方法
Future<void> _connectToRoom() async {
  try {
    await room.connect(
      'ws://localhost:7880',
      'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjEwNjcxMzA2NDgzLCJpc3MiOiJkZXZrZXkiLCJuYW1lIjoidXNlcjEiLCJuYmYiOjE2NzEzMDY0ODMsInN1YiI6InVzZXIxIiwidmlkZW8iOnsicm9vbSI6Im15LWZpcnN0LXJvb20iLCJyb29tSm9pbiI6dHJ1ZX19.SQ2OSWl1CG7UVbui_vmChfmUkYvT3QxKgXd9Yh167ws',
      roomOptions: _roomOptions,
      fastConnectOptions: FastConnectOptions(
        microphone: const TrackOption(enabled: true),
        camera: const TrackOption(enabled: true),
      ),
    );
  } catch (e) {
    print('connection error $e');
  }
}

补充说明

  • 不能直接给initState添加async修饰符(因为initState要求返回void,而async方法返回Future<void>),所以需要单独定义异步方法并在initState中调用。
  • 所有返回Future的异步方法,若要捕获其异常,必须使用await配合try/catch,或者通过Future.catchError方法处理。

内容的提问来源于stack exchange,提问作者MOHAMMAD RASIM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 12:15:38