我正在使用通过代码报告错误的外部服务。
我有错误代码列表和相关消息。比如说,存在以下类别:身份验证错误,服务器错误。
在Python中实现这些错误的最聪明的方法是什么,所以我总是可以通过代码查找错误并获取相应的异常对象?
这是我直截了当的方法:
class AuthError(Exception):
pass
class ServerError(Exception):
pass
map = {
1: AuthError,
2: ServerError
}
def raise_code(code, message):
""" Raise an exception by code """
raise map[code](message)
希望看到更好的解决方案:)
答案 0 :(得分:2)
您的方法是正确的,但map
应该重命名为其他内容(例如ERROR_MAP
),因此它不会影响同名的内置内容。
你也可以考虑让函数返回而不是提升它:
def error(code, message):
""" Return an exception by code """
return ERROR_MAP[code](message)
def foo():
raise error(code, message)
通过将raise
语句放在foo
内,您可以将错误提升到更接近错误发生的位置,如果打印堆栈跟踪,则会有一两条线要跟踪。
答案 1 :(得分:0)
另一种方法是创建一个多态基类,实例化后,实际生成一个具有匹配代码的子类。
这是通过遍历父类的__subclasses__()
并将错误代码与类中定义的错误代码进行比较来实现的。如果找到,请改用该类。
示例:
class CodeError(Exception):
""" Base class """
code = None # Error code
def __new__(cls, code, *args):
# Pick the appropriate class
for E in cls.__subclasses__():
if E.code == code:
C = E
break
else:
C = cls # fall back
return super(CodeError, cls).__new__(C, code, *args)
def __init__(self, code, message):
super(CodeError, self).__init__(message)
# Subclasses with error codes
class AuthError(CodeError):
code = 1
class ServerError(CodeError):
code = 2
CodeError(1, 'Wrong password') #-> AuthError
CodeError(2, 'Failed') #-> ServerError
使用这种方法,关联错误消息预设,甚至将一个类映射到带有dict的多个代码是微不足道的。