Python中如何根据错误描述匹配并抛出对应自定义异常?
如何根据错误描述匹配并抛出对应的子类异常?
首先提个小细节:你定义的MainError父类里,super调用的是ApiException,但这个类并没有定义,会导致报错,先把父类修正一下:
class MainError(Exception): def __init__(self, msg, function_name, result): # 改成调用MainError的父类构造,或者直接用super()更简洁 super().__init__(f"Error: {msg}") self.function_name = function_name self.result = result
接下来回到你的核心需求:根据错误描述匹配对应_match属性的子类异常并抛出,咱们可以通过遍历父类的所有子类来实现,具体步骤如下:
1. 编写匹配异常类的工具函数
这个函数会遍历MainError的所有子类,检查子类的_match属性是否出现在错误描述中,返回第一个匹配的类(如果没有匹配到就返回父类MainError):
def get_matching_exception(error_msg): # 遍历MainError的直接子类 for exception_subclass in MainError.__subclasses__(): # 确保子类有_match属性,且错误信息包含匹配字符串 if hasattr(exception_subclass, '_match') and exception_subclass._match in error_msg: return exception_subclass # 没有匹配到子类时,返回父类兜底 return MainError
2. 使用工具函数抛出对应异常
当你拿到错误描述、函数名和结果时,就可以用这个函数找到对应的异常类并抛出:
# 示例:假设这是你捕获到的错误信息 error_msg = "Request failed: Forbidden" func_name = "fetch_user_resource" error_result = {"status_code": 403, "response": "Access denied"} # 获取匹配的异常类 TargetException = get_matching_exception(error_msg) # 抛出异常 raise TargetException(error_msg, func_name, error_result)
3. 进阶优化:支持多层子类继承
如果你的异常子类还有自己的子类(多层继承结构),上面的__subclasses__()只能拿到直接子类,这时候可以写一个递归函数来遍历所有子孙类:
def get_all_exception_subclasses(cls): all_subclasses = [] for subclass in cls.__subclasses__(): all_subclasses.append(subclass) # 递归获取子类的子类 all_subclasses.extend(get_all_exception_subclasses(subclass)) return all_subclasses # 然后修改匹配函数 def get_matching_exception(error_msg): for exception_subclass in get_all_exception_subclasses(MainError): if hasattr(exception_subclass, '_match') and exception_subclass._match in error_msg: return exception_subclass return MainError
4. 可选:精确匹配
如果你需要的是精确匹配错误描述,而不是包含关系,只需要把判断条件改成:
if hasattr(exception_subclass, '_match') and exception_subclass._match == error_msg:
这样就能完美实现根据错误描述自动匹配并抛出对应子类异常的需求了。
内容的提问来源于stack exchange,提问作者user13699857
相关产品推荐
相关产品推荐

