目錄
- 一、異常處理基礎
- 1. 基本語法結構
- 二、常見異常類型
- 1. 內置異常層次
- 2. 常見異常示例
- 三、多重異常處理
- 1. 合并捕獲
- 2. 分層處理
- 四、finally與else子句
- 1. finally 應用場景
- 2. else 使用技巧
- 五、自定義異常
- 1. 創建異常類
- 2. 異常繼承體系
- 六、異常鏈與上下文
- 1. raise from 語法
- 2. 異常上下文查看
- 七、最佳實踐與陷阱
- 綜合實戰案例
一、異常處理基礎
1. 基本語法結構
try:# 可能引發異常的代碼result = 10 / 0
except ZeroDivisionError:# 處理特定異常print("不能除以零!")
except Exception as e:# 通用異常處理print(f"發生錯誤: {e}")
else:# 無異常時執行print("計算成功")
finally:# 始終執行的清理代碼print("清理資源")
- 異常傳播機制
二、常見異常類型
1. 內置異常層次
所有異常類都繼承 BaseException
BaseException├── KeyboardInterrupt├── SystemExit└── Exception├── ArithmeticError│ ├── ZeroDivisionError│ └── FloatingPointError├── LookupError│ ├── IndexError│ └── KeyError├── OSError│ ├── FileNotFoundError│ └── PermissionError└── ValueError
2. 常見異常示例
# 文件操作
try:with open("nonexist.txt") as f:content = f.read()
except FileNotFoundError:print("文件不存在")# 類型轉換
try:num = int("abc")
except ValueError:print("無效的數字格式")# 字典操作
d = {"key": "value"}
try:print(d["missing"])
except KeyError:print("鍵不存在")
三、多重異常處理
1. 合并捕獲
try:# 可能拋出多種異常的代碼
except (TypeError, ValueError) as e:print(f"輸入類型錯誤: {e}")
2. 分層處理
try:data = json.loads(invalid_json)
except json.JSONDecodeError:print("JSON解析失敗")
except Exception:print("其他未知錯誤")
四、finally與else子句
1. finally 應用場景
file = None
try:file = open("data.txt", "r")process(file)
except IOError:print("文件操作錯誤")
finally:if file:file.close() # 確保資源釋放
2. else 使用技巧
try:result = risky_operation()
except NetworkError:handle_error()
else:save_result(result) # 僅在成功時執行
五、自定義異常
1. 創建異常類
class InvalidEmailError(ValueError):"""自定義郵箱格式異常"""def __init__(self, email):super().__init__(f"無效郵箱格式: {email}")self.email = email# 使用示例
email = "user@"
if "@" not in email or "." not in email.split("@")[1]:raise InvalidEmailError(email)
2. 異常繼承體系
class DatabaseError(Exception):"""數據庫操作基類異常"""class ConnectionError(DatabaseError):"""數據庫連接異常"""class QueryError(DatabaseError):"""SQL查詢異常"""
六、異常鏈與上下文
1. raise from 語法
try:config = load_config()
except FileNotFoundError as e:raise RuntimeError("配置加載失敗") from e
2. 異常上下文查看
try:# 可能出錯的代碼
except Exception as e:print("原始異常:", e.__cause__)print("上下文:", e.__context__)
七、最佳實踐與陷阱
? 推薦做法
- 具體異常捕獲優先
- 添加有意義的錯誤信息
raise ValueError(f"無效參數值: {value}")
- 日志記錄異常
import logging
try:process()
except Exception:logging.exception("處理失敗")
?? 避免陷阱
- 捕獲過于寬泛的異常
try:...
except: # 捕獲所有異常,包括KeyboardInterruptpass
- 忽略異常
try:...
except Exception:pass # 靜默失敗
- 重復拋出異常
try:...
except Exception as e:print(e)raise # 保留原始堆棧信息
綜合實戰案例
網絡請求重試機制
import requests
from time import sleepdef fetch_data(url, retries=3):for attempt in range(retries):try:response = requests.get(url, timeout=5)response.raise_for_status()return response.json()except requests.HTTPError as e:print(f"HTTP錯誤: {e}")except requests.Timeout:print("請求超時")except requests.RequestException:print("網絡連接問題")if attempt < retries - 1:sleep(2 ** attempt) # 指數退避raise Exception(f"請求失敗,已重試{retries}次")# 使用示例
data = fetch_data("https://api.example.com/data")
通過掌握這些異常處理技巧,您可以:
- 編寫更健壯的程序
- 提高錯誤診斷效率
- 創建更友好的用戶交互體驗
- 構建可維護的異常處理體系
建議在實際開發中結合具體業務場景,設計合理的異常處理策略,并定期審查異常處理代碼的有效性