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

LibGDX使用gdx-websockets时无法捕获onMessage中的错误

问题分析与解决建议

可能的操作失误

  1. 未正确覆盖onMessage方法:你的onMessage方法缺少@Override注解,虽然日志显示该方法被调用,但这会存在潜在风险(比如接口方法签名变更时无法及时发现),且可能导致框架无法正确识别该方法为回调。
  2. 局部异常捕获范围不足:你仅对vtest.x = 1这一行做了异常捕获,但框架可能在调用onMessage时已经提前捕获了异常,或者线程上下文问题导致异常未进入你的局部捕获块。
  3. 误解setSendGracefully的作用:该参数仅控制WebSocket关闭时是否优雅发送剩余消息,和消息处理阶段的异常捕获完全无关,设置它无法解决你的问题。

解决步骤

  1. 添加@Override注解确保方法覆盖:
    修改onMessage方法,添加注解明确覆盖接口方法:

    @Override
    public boolean onMessage(WebSocket webSocket, String packet) {
        // ... 原有逻辑
    }
    
  2. 全局包裹onMessage逻辑的异常捕获:
    将整个onMessage方法的逻辑包裹在try-catch(Throwable)中,确保任何异常都能被捕获:

    @Override
    public boolean onMessage(WebSocket webSocket, String packet) {
        try {
            Gdx.app.log(TAG, "onMessage: " + packet);
            
            Vector2 vtest = null;
            vtest.x = 1;
        } catch (Throwable t) {
            Gdx.app.error(TAG, "onMessage 执行出错", t);
        }
        return false;
    }
    
  3. 测试onError回调是否正常工作:
    在onMessage中手动抛出一个异常,验证onError是否被触发:

    @Override
    public boolean onMessage(WebSocket webSocket, String packet) {
        Gdx.app.log(TAG, "onMessage: " + packet);
        throw new RuntimeException("测试异常");
    }
    

    如果onError仍未触发,说明你的WebSocketListener可能未正确注册,或者使用的gdx-websockets版本存在bug,建议升级到最新版本。

  4. 排查多Listener冲突:
    检查是否有多个WebSocketListener被添加到同一个WebSocket实例中,其他Listener可能提前捕获了异常并阻止了后续回调。

补充说明

gdx-websockets的Java端实现(如基于Jetty)会在调用onMessage时捕获所有Throwable并转发到onError,但如果你的onMessage内部自行捕获了异常,框架就不会再触发onError。因此确保异常能被你的捕获块捕获,或者让异常抛出触发onError。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 14:57:50