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
相关产品推荐
相关产品推荐

