Python 反映远程服务错误代码的异常

Python 反映远程服务错误代码的异常,python,error-handling,Python,Error Handling,我正在使用一个外部服务,它通过代码报告错误 我有错误代码和相关消息的列表。例如,存在以下类别:身份验证错误、服务器错误 在Python中实现这些错误的最聪明的方法是什么,这样我就可以通过代码查找错误并获得相应的异常对象 以下是我的直截了当的方法: class AuthError(Exception): pass class ServerError(Exception): pass map = { 1: AuthError, 2: ServerError } d

我正在使用一个外部服务,它通过代码报告错误

我有错误代码和相关消息的列表。例如,存在以下类别:身份验证错误、服务器错误

在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)

希望看到更好的解决方案:)

您的方法是正确的,只是
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将一个类映射到多个代码都很简单