Python內(nèi)置函數(shù)之raise函數(shù)詳解與實(shí)戰(zhàn)案例
在 Python 中,raise 語句用于主動(dòng)拋出異常,是錯(cuò)誤處理機(jī)制的核心組成部分。以下是關(guān)于 raise 的詳細(xì)解析和實(shí)戰(zhàn)案例。
一、基本語法
raise [Exception [, args [, traceback]]]
Exception:必需,異常類(如ValueError、TypeError)。args:可選,傳遞給異常的參數(shù)(通常是錯(cuò)誤信息)。traceback:可選,異常的堆棧跟蹤對(duì)象(極少使用)。
二、拋出內(nèi)置異常
Python 內(nèi)置了數(shù)十種異常類,常見的有:
ValueError:參數(shù)值不合法TypeError:類型不匹配IndexError:索引超出范圍KeyError:字典鍵不存在FileNotFoundError:文件不存在
示例 1:值錯(cuò)誤
def divide(a, b):
if b == 0:
raise ValueError("除數(shù)不能為零")
return a / b
try:
result = divide(10, 0)
except ValueError as e:
print(f"錯(cuò)誤: {e}") # 輸出: 錯(cuò)誤: 除數(shù)不能為零示例 2:類型錯(cuò)誤
def greet(name):
if not isinstance(name, str):
raise TypeError("name 必須是字符串")
print(f"Hello, {name}")
greet(123) # 拋出 TypeError三、自定義異常
通過繼承 Exception 類創(chuàng)建自定義異常,增強(qiáng)代碼可讀性。
步驟 1:定義異常類
class InvalidEmailError(Exception):
"""郵箱格式錯(cuò)誤"""
def __init__(self, email, message="郵箱格式不正確"):
self.email = email
self.message = message
super().__init__(self.message)
def __str__(self):
return f"{self.email} -> {self.message}"步驟 2:使用自定義異常
def validate_email(email):
if "@" not in email:
raise InvalidEmailError(email)
return email
try:
validate_email("test.com")
except InvalidEmailError as e:
print(f"驗(yàn)證失敗: {e}") # 輸出: 驗(yàn)證失敗: test.com -> 郵箱格式不正確四、異常鏈與raise from
使用 raise from 保留原始異常信息,形成異常鏈。
示例:多層異常捕獲
def parse_int(s):
try:
return int(s)
except ValueError as e:
# 保留原始錯(cuò)誤并拋出新異常
raise TypeError("無法將輸入轉(zhuǎn)換為整數(shù)") from e
try:
parse_int("abc")
except TypeError as e:
print(f"外層錯(cuò)誤: {e}")
print(f"原始錯(cuò)誤: {e.__cause__}")輸出:
外層錯(cuò)誤: 無法將輸入轉(zhuǎn)換為整數(shù)
原始錯(cuò)誤: invalid literal for int() with base 10: 'abc'
五、實(shí)戰(zhàn)場(chǎng)景
1.輸入驗(yàn)證
def register_user(age):
if age < 18:
raise ValueError("必須年滿18歲才能注冊(cè)")
# 注冊(cè)邏輯...2.接口適配
def fetch_data(url):
response = requests.get(url)
if response.status_code != 200:
raise ConnectionError(f"請(qǐng)求失敗: {response.status_code}")
return response.json()3.狀態(tài)檢查
class BankAccount:
def __init__(self, balance):
self.balance = balance
def withdraw(self, amount):
if amount > self.balance:
raise RuntimeError("余額不足")
self.balance -= amount4.替代返回錯(cuò)誤碼
# 不推薦:返回錯(cuò)誤碼
def divide(a, b):
if b == 0:
return None, "除數(shù)不能為零"
return a / b, None
# 推薦:拋出異常
def divide(a, b):
if b == 0:
raise ValueError("除數(shù)不能為零")
return a / b六、最佳實(shí)踐
- 具體異常優(yōu)先:拋出具體的異常類(如
ValueError),而非通用的Exception。 - 異常信息明確:提供足夠的上下文信息,便于調(diào)試。
- 避免過度使用:僅在真正異常的情況下使用
raise,不要替代正常的條件判斷。 - 異常處理:在適當(dāng)?shù)膶蛹?jí)捕獲并處理異常,避免程序崩潰。
七、常見錯(cuò)誤
- 遺漏異常參數(shù):
raise ValueError # 正確:raise ValueError()
異常鏈斷裂:
try:
1 / 0
except ZeroDivisionError:
raise ValueError("自定義錯(cuò)誤") # 丟失原始錯(cuò)誤信息
# 應(yīng)使用:raise ValueError("自定義錯(cuò)誤") from e通過合理使用 raise,可以構(gòu)建更健壯、更易于維護(hù)的 Python 程序。異常處理是高級(jí)編程的必備技能,建議結(jié)合 try-except-finally 語句一起學(xué)習(xí)。
到此這篇關(guān)于Python內(nèi)置函數(shù)之raise函數(shù)詳解與實(shí)戰(zhàn)案例的文章就介紹到這了,更多相關(guān)python raise函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談Pytorch torch.optim優(yōu)化器個(gè)性化的使用
今天小編就為大家分享一篇淺談Pytorch torch.optim優(yōu)化器個(gè)性化的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-02-02
python tkinter圖形界面代碼統(tǒng)計(jì)工具
這篇文章主要為大家詳細(xì)介紹了python tkinter圖形界面代碼統(tǒng)計(jì)工具,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09
pyecharts X軸標(biāo)簽太長被截?cái)嗟膯栴}及解決
這篇文章主要介紹了pyecharts X軸標(biāo)簽太長被截?cái)嗟膯栴}及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
Python爬取當(dāng)網(wǎng)書籍?dāng)?shù)據(jù)并數(shù)據(jù)可視化展示
這篇文章主要介紹了Python爬取當(dāng)網(wǎng)書籍?dāng)?shù)據(jù)并數(shù)據(jù)可視化展示,下面文章圍繞Python爬蟲的相關(guān)資料展開對(duì)爬取當(dāng)網(wǎng)書籍?dāng)?shù)據(jù)的詳細(xì)介紹,需要的小伙伴可以參考一下,希望對(duì)你有所幫助2022-01-01
python中if-elif-else語句實(shí)例用法講解
在本篇文章里小編給大家整理的是一篇關(guān)于python中if-elif-else語句的使用注意事項(xiàng),有需要的便宜么可以跟著參考下。2021-10-10

