2016-01-30 46 views
1

我在龍捲風應用中實現端點,並懷疑如何提升和處理異常。如果發生異常,我應該舉起還是冒泡?

我得到的方法收集所有引發的異常並記錄它們。它看起來像這樣:

def get(self): 
    try: 
     req = self.get_request_params() 
    except Exception as e: 
     self.send_json(status_code=400, status_text=str(e)) 
     logging.exception(str(e)) 

這裏是get_request_params這可能會拋出異常:

def get_request_params(self): 
    try: 
     user_id = UUID(self.get_query_argument("user_id", None)) 
    except ValueError: 
     raise ValueError("Incorrect argument value for user_id = %s" % user_id) 

    try: 
     from_date = self.get_query_argument("from", default=None) 
     datetime.datetime.strptime(from_date, '%Y-%m-%d') 
    except ValueError: 
     raise ValueError("Incorrect argument value for from_date = %s, should be YYYY-MM-DD" % from_date) 
    ... 

也有其他請求參數,它以同樣的方式進行檢查。看起來我正在努力做更多的事情。相反,它我可以有這樣的事情:

def get_request_params(self): 
    user_id = UUID(self.get_query_argument("user_id", None)) 
    from_date = self.get_query_argument("from", default=None) 
    datetime.datetime.strptime(from_date, '%Y-%m-%d') 
    ... 

在這種情況下,任何異常將泡沫並將於get方法處理。但是,我會失去那些漂亮的信息。

那麼,我應該如此明確地提出例外,還是足以讓事情繼續下去?

+1

我會讓例外泡沫。 –

回答

1

如果發現異常,意味着您打算對做一些事情,即使這些東西只是在忽略或重新提升之前輸出自定義日誌消息。如果只有你做的事情是重新提高它,那麼你不應該在第一個地方抓住它。 (這可能表明您正在捕獲的錯誤類別太寬。)

+0

那麼,讓它泡? –

+0

「......你不應該把它放在第一位。」是。 – chepner

+0

一般情況下:否。捕捉異常允許傳播較少的通用錯誤,這對於目標組可能很有用。在這種特殊情況下,'strptime'拋出的錯誤已經非常接近操作提示信息。然而,還有一個額外的信息:這是從「最新」提出投訴。當遊戲中有更多的日期時,這可能是一個有價值的附加信息,並可能證明「except」。 – flaschbier