Day 25: Python異常處理機制
Review
上一節主要是熟悉os
等python
中的文件操作,包含:
- 基礎操作:目錄獲取、文件列舉、路徑拼接
- 系統交互:環境變量管理、跨平臺兼容性
- 高級功能:目錄樹遍歷、文件系統分析
Today
今天專注于Python的異常處理機制。在借助AI寫代碼時,經常會遇到try-except
的異常處理模塊。這是因為大部分大模型在后訓練階段都經過強化學習訓練,為了確保結果的正確運行,采用try-except
異常處理能提高模型運行成功的概率。
異常處理機制概述
Python的異常處理機制為程序提供了強大的容錯能力(fault tolerance)。當程序在運行時遇到意外情況(即異常),它不會直接崩潰,而是可以被設計成優雅地處理這些錯誤。
當異常發生時,Python會創建一個異常對象(exception object)。如果這段可能出錯的代碼位于try
語句塊中,程序流程會尋找并跳轉到匹配的except
語句塊來處理這個異常。
常見的Python異常類型
1. SyntaxError(語法錯誤)
- 原因:代碼不符合Python的語法規則,解釋器在解析代碼時就會失敗
- 特點:在程序運行之前就會被檢測到
# 示例:缺少冒號
# def my_function()
# print("Hello")
2. NameError(名稱錯誤)
- 原因:嘗試使用一個未被定義的變量、函數或對象
# print(some_undefined_variable) # 變量未定義
3. TypeError(類型錯誤)
- 原因:對不支持該操作的數據類型執行了某個操作
# print("Age: " + 25) # 字符串和整數不能直接相加
4. ValueError(值錯誤)
- 原因:函數接收到的參數類型正確,但其值不合適
# number = float("12.34.56") # 不是有效的浮點數表示
5. IndexError(索引錯誤)
- 原因:嘗試訪問序列中不存在的索引
# data = ("apple", "banana")
# print(data[2]) # 索引超出范圍
6. KeyError(鍵錯誤)
- 原因:嘗試訪問字典中不存在的鍵
# student_grades = {"math": 90, "science": 85}
# print(student_grades["history"]) # 鍵不存在
7. AttributeError(屬性錯誤)
- 原因:嘗試訪問對象沒有的屬性或方法
# a_string = "hello"
# print(a_string.length) # 應該用 len(a_string)
8. ZeroDivisionError(除零錯誤)
- 原因:嘗試將數字除以零
# result = 10 / 0
9. FileNotFoundError(文件未找到錯誤)
- 原因:嘗試打開不存在的文件或路徑不正確
# import pandas as pd
# data = pd.read_csv("nonexistent.csv")
10. ModuleNotFoundError(模塊未找到錯誤)
- 原因:嘗試導入不存在的模塊
# import nonexistent_module
錯誤信息的解讀
當代碼出現錯誤時,程序會打印出"traceback"(回溯信息),包含:
- 錯誤類型(如NameError, TypeError)
- 錯誤發生的文件名和行號
- 導致錯誤的代碼行
- 錯誤的簡要描述
try-except基本用法
# 基本結構
try:# 可能會引發異常的代碼result = numerator / denominator
except ZeroDivisionError:# 當發生除零錯誤時執行print("錯誤:除數不能為零!")result = "未定義"
捕獲多種異常
def safe_divide(a, b):try:result = a / bexcept ZeroDivisionError:print("錯誤:除數不能為零!")return Noneexcept TypeError:print("錯誤:輸入必須是數字!")return Noneelse:# 只有當try塊成功執行時才會執行print(f"計算成功,結果是: {result}")return result
try-except-else-finally完整結構
try:# 可能引發異常的代碼file = open('data.txt', 'r')data = file.read()
except FileNotFoundError:# 處理文件不存在的情況print("文件未找到")data = None
else:# try成功時執行print("文件讀取成功")process_data(data)
finally:# 無論如何都會執行(清理資源)if 'file' in locals() and not file.closed:file.close()print("文件已關閉")
finally在ML/DL項目中的應用
finally
子句的"保證執行"特性在機器學習和深度學習項目中特別重要:
- 日志文件管理:確保訓練日志被正確保存
- 計算資源釋放:GPU內存、分布式計算資源的釋放
- 數據庫連接關閉:避免連接泄漏
- 全局狀態恢復:恢復修改過的配置或環境變量
- 檢查點保存:訓練中斷時保存模型狀態
# ML訓練示例
try:model = load_model()model.train(epochs=100)
except KeyboardInterrupt:print("訓練被中斷")
except RuntimeError as e:print(f"訓練錯誤: {e}")
else:print("訓練成功完成")save_final_model(model)
finally:# 無論如何都要執行的清理工作save_checkpoint(model)release_gpu_memory()close_tensorboard_writer()
最佳實踐建議
- 具體化異常類型:避免使用裸露的
except
,應指定具體的異常類型 - 記錄錯誤信息:在
except
塊中記錄詳細的錯誤信息,便于調試 - 適度使用:不要過度使用異常處理來控制正常的程序流程
- 資源管理:優先使用
with
語句進行資源管理,它隱式使用了finally
機制
小結
異常處理是Python編程的重要組成部分。通過合理使用try-except-else-finally
結構,我們可以:
- 提高程序的健壯性和用戶體驗
- 優雅地處理各種錯誤情況
- 確保資源被正確釋放
- 在ML/DL項目中構建更穩定的訓練流程
浙大疏錦行