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

Python自定义异常处理:如何移除返回结果中的__main__.numerror前缀

Python自定义异常仅返回JSON字符串的实现方法

要解决捕获自定义异常时显示类前缀的问题,核心是重写异常类的__str__和__repr__方法,控制异常对象的字符串输出格式。

原问题场景示例代码

假设你最初的代码是这样的:

import json

class numerror(Exception):
    def __init__(self, message):
        error_msg = json.dumps({"nmerror": message})
        super().__init__(error_msg)

try:
    raise numerror("invalid number")
except numerror as e:
    print(e)  # 输出: numerror('{"nmerror": "invalid number"}')
    # 交互式环境中直接查看e,会显示 __main__.numerror('{"nmerror": "invalid number"}')

解决方案:重写字符串表示方法

修改自定义异常类,添加__str__和__repr__方法,直接返回你构造的JSON字符串:

import json

class numerror(Exception):
    def __init__(self, message):
        self.error_json = json.dumps({"nmerror": message})
        super().__init__(self.error_json)
    
    # 控制print(e)或str(e)的输出
    def __str__(self):
        return self.error_json
    
    # 控制交互式环境、repr(e)的输出
    def __repr__(self):
        return self.error_json

try:
    raise numerror("invalid number")
except numerror as e:
    print(e)  # 输出: {"nmerror": "invalid number"}
    print(repr(e))  # 输出: {"nmerror": "invalid number"}

原理说明

  • Python默认的异常字符串表示(__str__)和官方表示(__repr__)会包含异常类名及传入的参数,这就是你看到__main__.numerror(...)的原因。
  • 重写这两个方法后,无论通过str(e)转换字符串、直接print(e),还是在交互式环境中查看异常对象,都会直接返回你定义的JSON字符串。

另一种简化场景

如果只需要在捕获异常后返回JSON字符串,也可以无需修改异常类,直接在捕获时处理:

try:
    raise numerror("invalid number")
except numerror as e:
    # 去掉默认字符串的外层引号
    result = str(e).strip("'")
    print(result)  # 输出: {"nmerror": "invalid number"}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 18:33:21