Python中的raise關鍵字詳解
更新時間:2025年04月14日 15:20:28 作者:Yant224
這篇文章主要介紹了Python中的raise關鍵字,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
一、核心語法解析
1.1 基礎語法形式
raise [異常類型[(參數)]]
用法說明??:
- 只能存在于異常處理塊(
except或finally)內部 - 自動重新拋出當前捕獲的異常
- 保持原始異常堆棧信息
1.2 完整語法結構
raise [異常類型[(參數)]] [from 原因]
二、基礎用法場景
2.1 觸發(fā)內置異常
# 參數校驗場景
def calculate_square(n):
if not isinstance(n, (int, float)):
raise TypeError("必須傳入數值類型")
return n ?**? 2
# 調用示例
calculate_square("5") # 觸發(fā) TypeError三、高級用法技巧
3.1 異常鏈(Exception Chaining)
import json
try:
config = json.load(open('config.json'))
except FileNotFoundError as fnf_error:
raise RuntimeError("配置文件加載失敗") from fnf_error
# 錯誤輸出顯示關聯關系
# RuntimeError: 配置文件加載失敗
# The above exception was the direct cause of...3.2 自定義異常觸發(fā)python
class NetworkTimeout(Exception):
"""自定義網絡超時異常"""
def __init__(self, host, timeout):
self.host = host
self.timeout = timeout
super().__init__(f"連接 {host} 超時({timeout}s)")
# 觸發(fā)自定義異常
if response_time > 30:
raise NetworkTimeout("api.example.com", 30)
四、特殊形式詳解
4.1 無異常類型拋出
def deprecated_feature():
raise "該功能已廢棄" # ? 錯誤!必須拋出 Exception 實例
# 正確做法
def deprecated_feature():
raise DeprecationWarning("該功能已廢棄")4.2 異常參數傳遞
try:
raise ValueError("無效輸入", 404, {"detail": "ID不合法"})
except ValueError as e:
print(e.args) # ('無效輸入', 404, {'detail': 'ID不合法'})五、常見使用模式
5.1 防御式編程
def divide(a, b):
if b == 0:
raise ZeroDivisionError("除數不能為零")
return a / b5.2 API 錯誤處理
def fetch_data(url):
response = requests.get(url)
if 400 <= response.status_code < 500:
raise ClientError(response.status_code, response.text)
elif response.status_code >= 500:
raise ServerError(response.status_code)
return response.json()六、最佳實踐指南
6.1 異常類型選擇原則
| 錯誤場景 | 推薦異常類型 |
|---|---|
| 參數類型錯誤 | TypeError |
| 參數值無效 | ValueError |
| 文件操作錯誤 | IOError |
| 業(yè)務規(guī)則違反 | 自定義異常 |
6.2 異常消息規(guī)范
# 不推薦
raise ValueError("錯誤發(fā)生")
# 推薦格式
raise ValueError(f"參數 {param} 的值 {value} 超出有效范圍(允許范圍:{min}~{max})")七、注意事項
from 參數使用??
# 顯示原始異常原因 raise ParsingError from original_error
性能考量??
- 避免在循環(huán)中頻繁拋出異常
- 異常處理耗時是條件判斷的
10-100倍
調試輔助??
# 打印完整堆棧
import traceback
try:
risky_call()
except:
traceback.print_exc()
raise # 重新拋出八、綜合應用示例
8.1 數據驗證鏈
def validate_user(user):
if not user.get('username'):
raise ValueError("用戶名必填")
if len(user['password']) < 8:
raise SecurityError("密碼至少8位")
if not re.match(r"[^@]+@[^@]+\.[^@]+", user['email']):
raise FormatError("郵箱格式無效")
return True8.2 上下文管理器
class Transaction:
def __enter__(self):
if not self.conn.is_valid():
raise ConnectionError("數據庫連接失效")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
if exc_type:
self.rollback()
raise TransactionError("事務執(zhí)行失敗") from exc_val
self.commit()總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Python3 jupyter notebook 服務器搭建過程
這篇文章主要介紹了Python3 jupyter notebook 服務器搭建過程,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧2018-11-11
一文了解python 3 字符串格式化 F-string 用法
本文介紹在python 3 編程中,如何進行字符串格式化。介紹了F-string的用法,通過實例代碼給大家介紹的非常詳細,對大家的工作或學習具有一定的參考借鑒價值,需要的朋友參考下吧2020-03-03

