過分熱心的條款

異常是強大的,但是一個過分熱心的 except 子句可以將它全部帶到一行。

try:
    res = get_result()
    res = res[0]
    log('got result: %r' % res)
except:
    if not res:
        res = ''
    print('got exception')

此示例演示了反模式的 3 個症狀:

  1. 沒有例外型別的 except(第 5 行)將捕獲甚至健康的例外,包括 KeyboardInterrupt 。這將阻止程式在某些情況下退出。
  2. except 塊不會重新載入錯誤,這意味著我們無法判斷異常是來自 get_result 還是因為 res 是一個空列表。
  3. 最糟糕的是,如果我們擔心結果是空的,我們會導致更糟糕的事情。如果 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)

我們會捕獲更具體的例外情況,並在必要時重新加註。還有幾行,但無限正確。