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
相关产品推荐
相关产品推荐

