jsonexception 是 php 7.3 起引入的 exception 子类,用于在启用 json_throw_on_error 时抛出;它不是 throwable 新分支,也不等同于不存在的 jsonthrowable,且在 php 8.3 中仍继承 exception,可被 catch (exception $e) 捕获。

PHP 8.3 中没有 JsonThrowable 这个类,也不存在名为 JsonThrowable 的常量。这是常见误解——实际存在的、与 JSON 相关的异常类是 JsonException,它自 PHP 7.3 起引入,且始终是 Exception 的子类,而非独立实现 Throwable 的新分支。
JsonException 在各版本中的可用性与行为差异
JsonException 是一个标准异常类,不是“常量”,也不属于新增的 Throwable 分支(Error/Exception 并列结构)。它的存在和使用方式在 PHP 7.3–8.3 间保持稳定:
- PHP 7.3 及以上才定义了
JsonException类;7.2 及更早版本中该类不存在,调用json_decode($bad, true, 512, JSON_THROW_ON_ERROR)会直接报Fatal error: Uncaught Error或静默返回null(取决于是否启用标志) - 即使在 PHP 8.3,
JsonException仍继承Exception,因此catch (Exception $e)可捕获它,无需升级为catch (Throwable $e)——但若同时想捕获TypeError等错误,就必须用后者 -
JSON_THROW_ON_ERROR是一个整型常量(值为4194304),不是类或接口,所有支持 JSON 函数的 PHP 版本(5.2+)都定义它,但只有 7.3+ 才让该标志触发JsonException
旧版本(如 PHP 7.2 或更低)如何安全处理 JSON 解析失败
不能依赖 JsonException 时,必须回归传统容错模式:
- 始终检查
json_decode()返回值是否为null,再配合json_last_error()判断具体错误类型 - 避免直接使用
JSON_THROW_ON_ERROR标志(7.2 不识别该行为,会忽略并静默失败) - 对关键输入做预清洗:如用
mb_detect_encoding()和mb_convert_encoding()处理编码问题,或用正则粗筛明显非法字符(如未闭合引号、控制字符)
跨版本统一捕获 JSON 相关异常的写法
若项目需兼容 PHP 7.3+ 与 8.3,又希望代码简洁,可采用“降级兼容 + 类型判断”策略:
- 启用
JSON_THROW_ON_ERROR,并用catch (Exception $e)捕获(覆盖JsonException) - 额外加一层
catch (TypeError $e)或catch (Throwable $e)应对其他可能抛出的底层错误(如内存不足导致解析中断) - 不推荐仅靠
catch (JsonException $e),因低版本会直接报错退出,无法进入 catch 块
注意:别把 json_last_error() 的返回值当成异常类
json_last_error() 返回的是整数错误码(如 4 表示 JSON_ERROR_SYNTAX),它本身不是异常,也不会自动触发 throw。必须手动判断并决定是否 throw new JsonException()(仅限 7.3+)或 throw new RuntimeException()(兼容旧版)。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











