首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

Python 異常處理完整指南:try/except/finally、自訂異常、堆疊追蹤與 logging 實戰

     編輯:更多程式設計知識

Python 內建 try...except...finally 機制靈活強大,支援多重捕獲、異常鏈、跨層傳播與 logging 整合。本文系統整理核心語法、最佳實踐與常見陷阱,適用 Python 2.x/3.x 雙版本。

基礎語法結構

try:
    print('try...')
    r = 10 / 0
    print('result:', r)
except ZeroDivisionError as e:
    print('except:', e)
finally:
    print('finally...')
print('END')

輸出:

try...
except: integer division or modulo by zero
finally...
END

多重 except 與繼承關係

try:
    r = 10 / int('a')
except ValueError as e:
    print('ValueError:', e)
except ZeroDivisionError as e:
    print('ZeroDivisionError:', e)
else:
    print('no error!')
finally:
    print('finally...')
  • except 依序匹配,子類別必須寫在父類別之前,否則永不被捕獲(如 ValueError 是 StandardError 子類)。
  • else 區塊:無異常時執行,適合放置「正常流程收尾」邏輯。

跨層傳播與堆疊追蹤

def foo(s): return 10 / int(s)
def bar(s): return foo(s) * 2
def main():
    try:
        bar('0')
    except StandardError as e:
        print('Error!')
        # logging.exception(e)  # 記錄完整堆疊
    finally:
        print('finally...')

只需在最外層(或適當層級)捕獲,中間函式無需重複 try/except,大幅減少樣板碼。

記錄錯誤:logging.exception

import logging
logging.basicConfig(level=logging.ERROR)
try:
    bar('0')
except StandardError as e:
    logging.exception(e)  # 自動包含堆疊追蹤
print('END')  # 程式繼續執行

輸出含完整 Traceback,且程式不會終止;生產環境建議搭配 RotatingFileHandler 落盤。

主動拋出與自訂異常

class FooError(StandardError): pass

def foo(s):
    n = int(s)
    if n == 0:
        raise FooError('invalid value: %s' % s)
    return 10 / n
  • 繼承內建異常(ValueError, TypeError, RuntimeError 等)語意更清晰。
  • 僅在業務邏輯需要區分錯誤類型時才自訂。

raise 重拋與轉換

try:
    10 / 0
except ZeroDivisionError:
    raise ValueError('input error!')  # 合理轉換

# 裸 raise 保留原始異常並繼續傳播
except StandardError as e:
    logging.error(e)
    raise

原則:轉換需符合語意邏輯,切勿將 IOError 強行轉為 ValueError。

最佳實踐清單

  1. 盡量使用具體異常類別,避免 except: 捕獲所有(含 KeyboardInterrupt, SystemExit)。
  2. 資源釋放(檔案、連線、鎖)放入 finally 或使用 with 語句(Context Manager)。
  3. 異常訊息包含足夠上下文(參數值、呼叫鏈)利於事後除錯。
  4. 文件字串說明函式可能拋出的異常類型與觸發條件。

善用 try/except/finally 與 logging,能讓程式在錯誤發生時優雅降級、保留現場、持續服務。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved