2014-01-28 27 views
2

我正在使用通過代碼報告錯誤的外部服務。反映遠程服務的錯誤代碼的例外

我有錯誤代碼和相關消息的列表。說,存在以下類別:認證錯誤,服務器錯誤。

什麼是在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

你的方法是正確的,但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,你會引發錯誤更加接近其錯誤發生,並且如果打印堆棧軌跡,將會有一兩行較少的行追蹤。

+0

好點,非常感謝! – kolypto

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 

採用這種方法,是微不足道的錯誤消息預設相關聯,並且甚至一個映射類,以多個代碼與一個字典。

相關問題