python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python raise报错显示Unicode码解决

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

作者: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"]}}

可以看到:

2. 问题原因

2.1json.dumps()默认行为

2.2 控制台打印时的显示

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": ["正文"]}}

优点

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

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']}")  # 直接访问中文字段

运行结果

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

缺点

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 结构,不利于程序化处理。

4. 最佳实践

方案适用场景推荐指数
json.dumps(..., ensure_ascii=False)需要异常信息既可读又可被程序解析⭐⭐⭐⭐⭐
手动解析 JSON 字符串无法修改 json.dumps() 调用⭐⭐
直接构造错误信息错误信息不需要 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码解决内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文