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

Android中解析Throwable错误消息及提取JSON格式消息内容的方法

嘿,这个问题我在日常Android开发中碰到过好几次,来给你梳理下靠谱的解决方案~

在Android中解析Throwable的错误消息

一、常规场景下的Throwable错误消息获取

首先说最基础的情况:

  • 最直接的方式是调用ex.getMessage(),但要注意这个方法可能返回null,这时候可以退而求其次用ex.toString(),它会包含异常的类名和默认描述。
  • 如果异常是嵌套的(比如被包装过的RuntimeException,底层有真正的IOException作为cause),只拿外层的消息可能不够准确,最好遍历整个异常链,收集所有非空的错误信息:
public static String getFullErrorMessage(Throwable throwable) {
    StringBuilder errorBuilder = new StringBuilder();
    Throwable currentThrowable = throwable;
    
    while (currentThrowable != null) {
        String msg = currentThrowable.getMessage();
        if (msg != null && !msg.isEmpty()) {
            errorBuilder.append(msg).append("\n");
        }
        currentThrowable = currentThrowable.getCause();
    }
    
    return errorBuilder.length() > 0 
        ? errorBuilder.toString().trim() 
        : throwable.toString();
}

这个方法会把所有嵌套异常的消息都收集起来,避免漏掉关键的底层错误信息。

二、当getMessage()返回JSON格式时的最优提取方法

如果ex.getMessage()返回的是像{"message":"Authorization has been denied for this request."}这样的JSON字符串,绝对不要用字符串截取或者正则表达式——这种方式太脆弱,一旦JSON结构微调(比如key大小写变化、多了其他字段)就会失效。最优方案是用成熟的JSON解析库,这里给两种常用的选择:

方法1:用Android原生org.json库(无额外依赖,推荐)

Android SDK自带了org.json包,不需要引入任何第三方依赖,足够满足这种简单的解析需求:

public static String extractJsonErrorMessage(Throwable ex) {
    String jsonMsg = ex.getMessage();
    if (jsonMsg == null) {
        return getFullErrorMessage(ex); // 解析失败时回退到常规方法
    }
    
    try {
        JSONObject errorJson = new JSONObject(jsonMsg);
        // 用optString避免key不存在时抛异常,同时设置默认值
        return errorJson.optString("message", getFullErrorMessage(ex));
    } catch (JSONException e) {
        // 如果不是有效JSON,直接返回原始消息
        return jsonMsg;
    }
}

这个方法的容错性很强:如果JSON格式不对、key不存在,都会优雅地回退到常规错误消息,不会导致额外崩溃。

方法2:用Gson/Moshi(如果项目已依赖)

如果你的项目已经在使用Gson、Moshi这类JSON序列化库,可以用实体类来解析,可读性更好,也方便后续扩展:

比如用Gson的话,先定义一个简单的实体类:

public class ErrorResponse {
    private String message;

    public String getMessage() {
        return message;
    }
}

然后解析:

public static String extractMessageWithGson(Throwable ex) {
    String jsonMsg = ex.getMessage();
    if (jsonMsg == null) {
        return getFullErrorMessage(ex);
    }
    
    try {
        ErrorResponse errorResponse = new Gson().fromJson(jsonMsg, ErrorResponse.class);
        return errorResponse.getMessage() != null 
            ? errorResponse.getMessage() 
            : getFullErrorMessage(ex);
    } catch (JsonSyntaxException e) {
        return jsonMsg;
    }
}

这种方式适合JSON结构可能变化的场景,后续如果要添加code、details等字段,直接修改实体类就行,代码维护起来更轻松。

三、总结

  • 常规异常:优先遍历异常链获取完整消息,避免只拿到外层包装异常的模糊描述;
  • JSON格式消息:优先用原生org.json(无依赖)或项目已有的JSON库,绝对不要用字符串硬解析,保证稳定性和容错性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:54:31