過分熱心的條款
異常是強大的,但是一個過分熱心的 except 子句可以將它全部帶到一行。
try:
res = get_result()
res = res[0]
log('got result: %r' % res)
except:
if not res:
res = ''
print('got exception')
此示例演示了反模式的 3 個症狀:
- 沒有例外型別的
except
(第 5 行)將捕獲甚至健康的例外,包括KeyboardInterrupt
。這將阻止程式在某些情況下退出。 - except 塊不會重新載入錯誤,這意味著我們無法判斷異常是來自
get_result
還是因為res
是一個空列表。 - 最糟糕的是,如果我們擔心結果是空的,我們會導致更糟糕的事情。如果
get_result
失敗,res
將保持完全未設定,並且在 except 塊中對res
的引用將提升NameError
,完全遮蔽原始錯誤。
始終考慮你嘗試處理的異常型別。給異常頁面一個讀取, 並瞭解存在哪些基本異常。
以下是上述示例的固定版本:
import traceback
try:
res = get_result()
except Exception:
log_exception(traceback.format_exc())
raise
try:
res = res[0]
except IndexError:
res = ''
log('got result: %r' % res)
我們會捕獲更具體的例外情況,並在必要時重新加註。還有幾行,但無限正確。