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

时间:2014-01-28 11:01:47

标签: python error-handling

我正在使用通过代码报告错误的外部服务。

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

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

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

2 个答案:

答案 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的多个代码是微不足道的。