Python使用raise报错抛出异常显示Unicode码的解决方法

 更新时间:2026年04月03日 08:28:55   作者:detayun  
在 Python 开发中,我们经常使用 raise 抛出异常来处理错误情况,但有时候,异常信息中的中文或其他非 ASCII 字符会被显示为 Unicode 转义序列,下面我们就来看看如何解决吧

在 Python 开发中,我们经常使用 raise 抛出异常来处理错误情况。但有时候,异常信息中的中文或其他非 ASCII 字符会被显示为 Unicode 转义序列(如 \u6b63\u6587),而不是直接显示中文(如“正文”)。这不仅影响可读性,还可能让调试变得困难。本文将详细分析这个问题,并提供解决方案。

1. 问题重现

1.1 示例代码

假设我们有一个函数 check_paragraph_order(),用于检查文档段落编号是否正确排序。如果发现异常,则抛出异常并附带错误信息:

import json

def get_paragraph_info():
    # 模拟返回段落信息(包含中文)
    return {
        "type": "paragraph",
        "index": 179,
        "content": "(1)建设业务经营:形成“国内+国际+新基建”三轮驱动;",
        "label": ["正文"]
    }

def check_paragraph_order():
    paragraph_info = get_paragraph_info()
    # 模拟检查失败,抛出异常
    raise Exception(json.dumps({
        'error_msg': '正文编号排序异常',
        'detail_msg': paragraph_info
    }))

try:
    check_paragraph_order()
except Exception as e:
    print(f"捕获到异常: {e}")

1.2 运行结果

运行上述代码后,控制台输出:

捕获到异常: {"error_msg": "\u6b63\u6587\u7f16\u53f7\u6392\u5e8f\u5f02\u5e38", "detail_msg": {"type": "paragraph", "index": 179, "content": "\uff081\uff09\u5efa\u8bbe\u4e1a\u52a1\u7ecf\u8425\uff1a\u5f62\u6210\u201c\u56fd\u5185+\u56fd\u9645+\u65b0\u57fa\u5efa\u201d\u4e09\u8f6e\u9a71\u52a8\uff1b", "label": ["\u6b63\u6587"]}}

可以看到:

  • error_msg 中的“正文编号排序异常”被显示为 \u6b63\u6587...
  • detail_msg 中的中文也被转义为 Unicode 编码。

2. 问题原因

2.1json.dumps()默认行为

  • json.dumps() 是 Python 中将字典转换为 JSON 字符串的方法。
  • 默认情况下json.dumps() 会将所有非 ASCII 字符(如中文、日文、韩文等)转义为 Unicode 编码(如 \u6b63)。
  • 这是 JSON 规范的一部分,目的是确保 JSON 字符串在所有环境中都能安全传输(避免编码问题)。

2.2 控制台打印时的显示

  • 当我们 print(Exception(...)) 或捕获异常后打印时,Python 会调用 str() 方法,而 Exceptionstr() 方法会直接显示 json.dumps() 的结果(包含 Unicode 转义)。
  • 因此,控制台看到的是 \u6b63\u6587...,而不是直接显示中文。

3. 解决方案

3.1 方法 1:使用ensure_ascii=False

最简单的方法是在 json.dumps() 中添加参数 ensure_ascii=False,强制保留非 ASCII 字符(如中文):

raise Exception(json.dumps({
    'error_msg': '正文编号排序异常',
    'detail_msg': get_paragraph_info()
}, ensure_ascii=False))

运行结果

捕获到异常: {"error_msg": "正文编号排序异常", "detail_msg": {"type": "paragraph", "index": 179, "content": "(1)建设业务经营:形成“国内+国际+新基建”三轮驱动;", "label": ["正文"]}}

优点

  • 直接显示中文,可读性高。
  • 保留 JSON 结构的机器可读性。

适用场景:需要异常信息既可读又可被程序解析时。

3.2 方法 2:手动解析 JSON 字符串(不推荐)

如果无法修改 json.dumps() 的调用,可以捕获异常后手动解析 JSON 字符串:

try:
    check_paragraph_order()
except Exception as e:
    error_json = str(e)  # 获取 JSON 字符串(含 Unicode)
    error_dict = json.loads(error_json)  # 解析 JSON 回字典
    print(f"错误信息: {error_dict['error_msg']}")  # 直接访问中文字段

运行结果

错误信息: 正文编号排序异常

缺点

  • 代码冗余,需要额外解析 JSON。
  • 仅适用于简单场景,不推荐广泛使用。

3.3 方法 3:直接构造错误信息(避免 JSON 转换)

如果错误信息不需要 JSON 结构,可以直接用字符串拼接:

def check_paragraph_order():
    paragraph_info = get_paragraph_info()
    error_msg = f"正文编号排序异常,详情: {paragraph_info}"
    raise Exception(error_msg)

运行结果

捕获到异常: 正文编号排序异常,详情: {'type': 'paragraph', 'index': 179, 'content': '(1)建设业务经营:形成“国内+国际+新基建”三轮驱动;', 'label': ['正文']}

优点

  • 简单直接,无需 JSON 转换。
  • 适用于错误信息不需要机器解析的场景。

缺点:丢失 JSON 结构,不利于程序化处理。

4. 最佳实践

方案适用场景推荐指数
json.dumps(..., ensure_ascii=False)需要异常信息既可读又可被程序解析⭐⭐⭐⭐⭐
手动解析 JSON 字符串无法修改 json.dumps() 调用⭐⭐
直接构造错误信息错误信息不需要 JSON 结构⭐⭐⭐

推荐方案

  • 优先使用 ensure_ascii=False,因为它既保留了 JSON 结构,又让中文直接显示。
  • 如果错误信息不需要 JSON 结构,可以直接用字符串拼接。

5. 总结

问题原因json.dumps() 默认转义非 ASCII 字符(如中文)为 Unicode 编码。

解决方案

  1. ensure_ascii=False(推荐):强制保留中文,直接显示。
  2. 手动解析 JSON(不推荐):适用于无法修改源码的情况。
  3. 直接构造字符串:适用于简单错误信息。

最佳实践:优先使用 ensure_ascii=False,兼顾可读性和机器可解析性。

6. 完整代码示例

import json

def get_paragraph_info():
    return {
        "type": "paragraph",
        "index": 179,
        "content": "(1)建设业务经营:形成“国内+国际+新基建”三轮驱动;",
        "label": ["正文"]
    }

def check_paragraph_order():
    paragraph_info = get_paragraph_info()
    # 使用 ensure_ascii=False 保留中文
    raise Exception(json.dumps({
        'error_msg': '正文编号排序异常',
        'detail_msg': paragraph_info
    }, ensure_ascii=False))

try:
    check_paragraph_order()
except Exception as e:
    print(f"捕获到异常: {e}")

运行结果

捕获到异常: {"error_msg": "正文编号排序异常", "detail_msg": {"type": "paragraph", "index": 179, "content": "(1)建设业务经营:形成“国内+国际+新基建”三轮驱动;", "label": ["正文"]}}

到此这篇关于Python使用raise报错抛出异常显示Unicode码的解决方法的文章就介绍到这了,更多相关Python raise报错显示Unicode码解决内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python实现自动发送邮件

    python实现自动发送邮件

    这篇文章主要为大家详细介绍了python实现自动发送邮件功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • python用folium绘制地图并设置弹窗效果

    python用folium绘制地图并设置弹窗效果

    这篇文章主要介绍了python用folium绘制地图并设置弹窗,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • python中实现指定时间调用函数示例代码

    python中实现指定时间调用函数示例代码

    函数function是python编程核心内容之一,也是比较重要的一块。下面这篇文章主要给大家介绍了关于python中实现指定时间调用函数的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-09-09
  • Pytest框架之fixture详解(三)

    Pytest框架之fixture详解(三)

    本文详细讲解了Pytest框架之fixture,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • Python中生成器和迭代器的区别详解

    Python中生成器和迭代器的区别详解

    这篇文章主要介绍了Python中生成器和迭代器的区别详解,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • python使用thrift教程的方法示例

    python使用thrift教程的方法示例

    这篇文章主要介绍了python使用thrift教程的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • 关于Python内存分配时的小秘密分享

    关于Python内存分配时的小秘密分享

    这篇文章主要给大家分享介绍了关于Python内存分配时的小秘密,文中通过示例代码介绍的非常详细,对大家学习或者使用Python具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • python dict 相同key 合并value的实例

    python dict 相同key 合并value的实例

    今天小编就为大家分享一篇python dict 相同key 合并value的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • python实现线性回归的示例代码

    python实现线性回归的示例代码

    线性回归就是通过多次取点,找出符合函数的曲线,那么就可以完成一维线性回归,本文通过实例代码给大家介绍python实现线性回归的相关知识,感兴趣的朋友一起看看吧
    2022-02-02
  • Python函数的定义与调用方法实例

    Python函数的定义与调用方法实例

    Python 中函数的应用非常广泛,函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段,这篇文章主要给大家介绍了关于Python函数的定义与调用的相关资料,需要的朋友可以参考下
    2023-06-06

最新评论