我正在清理一個API庫,並試圖找出處理未處理的異常的最佳方法。如何處理未處理的異常?
現在,圖書館捕捉到所有可能出現錯誤的API - 憑證錯誤,服務器錯誤,urllib2錯誤,httplib錯誤等等。將會出現邊緣情況。
我目前的想法是,99%的圖書館用戶不關心異常本身,他們只關心API調用失敗。只有開發人員會關心這個異常。
這使我這個解決方案:
class ApiError(Exception):
pass
class ApiUnhandledError(ApiError):
pass
與API的已知問題引發ApiError中或特定的子類。
其他一切都會引發一個ApiUnhandledError,原始錯誤被隱藏,用戶可以捕獲或忽略該錯誤。
try:
stuff
except urllib2.UrlError , e :
raise ApiError(raised=e)
except Exception as e :
raise ApiUnhandledError(raised=e)
這聽起來像是一種確保用戶只知道通過/失敗的好方法,而開發人員可以維護一種支持方法嗎?
更新
基於最佳實踐的共識,我不會捕捉這一點。
原來的目標是讓人們能夠做到這一點:
try:
stuff_a
other_stuff
even_more_stuff
api.proxy(url)
again_stuff
again_others
except api.ApiUnhandledError , e :
handle error
except api.ApiError , e :
handle error
except Stuff , e :
other error
except:
raise
在這個例子中,用戶只趕上ApiError中(以及可選ApiUnhandledError或任何其他子類)
我想這將有自己的塊在很大程度上最好每個API互動:
try:
stuff_a
other_stuff
even_more_stuff
try:
api.proxy(url)
except api.ApiError , e :
handle error
except CatchSomething1 , e :
handle error
except CatchSomething2 , e :
handle error
except CatchSomething3 , e :
handle error
except CatchSomething4 , e :
handle error
except:
raise
again_stuff
again_others
except Stuff , e :
other error
except:
raise
與urllib2的問題時,我已經似乎發現了新的除外離子每天。這些例外往往會變得很長,難以維持。
您確定要使用此類機制嗎?你只會用你的「假」來掩蓋一個真正的例外。我只是留下未經處理的例外,因爲它們是最具信息性的方式。如果你想將它們記錄在某處或創建一個普通的動作,那就是另一回事了。 – Michal 2013-05-07 14:34:41
我不確定我想要這樣做。我擔心的是有一些錯誤代碼可能會從底層庫中彈出。看看使用這個庫的我自己的「消費者」代碼,我不得不在自己的塊中嵌入對這個庫的調用,然後在它周圍鏈接大量的異常處理來捕獲這些錯誤。我試圖在上游端口處理這個異常處理,這似乎是一種可能的方式來最大限度地減少大多數消費者的工作,同時仍然保留例外情況。 – 2013-05-07 14:42:18