Python 反映远程服务错误代码的异常
我正在使用一个外部服务,它通过代码报告错误 我有错误代码和相关消息的列表。例如,存在以下类别:身份验证错误、服务器错误 在Python中实现这些错误的最聪明的方法是什么,这样我就可以通过代码查找错误并获得相应的异常对象Python 反映远程服务错误代码的异常,python,error-handling,Python,Error Handling,我正在使用一个外部服务,它通过代码报告错误 我有错误代码和相关消息的列表。例如,存在以下类别:身份验证错误、服务器错误 在Python中实现这些错误的最聪明的方法是什么,这样我就可以通过代码查找错误并获得相应的异常对象 以下是我的直截了当的方法: class AuthError(Exception): pass class ServerError(Exception): pass map = { 1: AuthError, 2: ServerError } d
以下是我的直截了当的方法:
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)
希望看到更好的解决方案:)您的方法是正确的,只是
map
应该重命名为其他名称(例如ERROR\u map
),这样它就不会影响相同名称的内置项
您还可以考虑使函数返回异常而不是引发异常:
def error(code, message):
""" Return an exception by code """
return ERROR_MAP[code](message)
def foo():
raise error(code, message)
通过将
raise
语句放在foo
中,您可以将错误提高到更接近错误发生的位置,并且如果打印堆栈跟踪,则可以少跟踪一行或两行。另一种方法是创建一个多态基类,该基类被实例化,实际生成一个具有匹配代码的子类
这是通过遍历父类的\uu子类
并将错误代码与类中定义的错误代码进行比较来实现的。如果找到,请使用该类
例如:
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将一个类映射到多个代码都很简单