2016-03-03 17 views
3

我正在編寫一個基於webapp2框架的web應用程序。我使用的是公共基礎例外所有的錯誤,我明確地拋出,就像是否存在用於向下轉換的Python成語?

class MyBaseException(Exception): 
    def __init__(self, status, code, message): 
     self.status_code = status 
     self.error_code = code 
     self.error_message = message 

,並有BaseRequestHandler輸出錯誤一個簡單的JSON響應,默認爲意外的異常500 /一般錯誤。

class BaseHandler(webapp2.RequestHandler): 
    def handle_exception(self, e, debug): 
     logger.exception(e) 

     status = e.status_code if isinstance(e, MyBaseException) else 500 
     code = e.error_code if isinstance(e, MyBaseException) else 'GENERIC_ERROR' 
     message = e.error_message if isinstance(e, MyBaseException) else 'Blah blah blah' 

     self.response.set_status(status) 
     self.response.content_type = 'application/json' 
     self.response.write(json.encode({"code": code, "message": message}) 

那些isinstance檢查長得不好看我的,所以我想,必須有一個更好的辦法。建議?

編輯這與下降有什麼關係?

在java中,我的「原生」的語言,我會做這樣的事情

MyBaseException b = (MyBaseException) e; 
JSONObject j = new JSONObject(); 
j.put("error_code", e.getCode()); 
j.put("error_message", e.getErrorMessage()); 
... 

但Python有沒有明確的類型轉換如此...是有可能做這樣的事情?

+2

這與下降有什麼關係? – Goyo

回答

2

通常的Python的成語是完全忽略類的對象,所以你只是做:

status = e.status_code 
code = e.error_code 
message = e.error_message 

這被稱爲duck typing

如果你可能需要處理其他類型的異常(其中,在您的Java例子中,你會得到一個ClassCastException)標準的Python的成語是隻是包裝在一個try整個事情...趕上:

try: 
    status = e.status_code 
    etc. 
catch AttributeError: # i.e. e doesn't have one of the listed attributes 
    status = "500" 
    etc.