Python異常處理從try-except到自定義異常的全過(guò)程
??? Python異常處理完全指南:從try-except到自定義異常
在Python編程中,異常處理是寫(xiě)出健壯代碼的關(guān)鍵技能。本文將帶你深入了解Python的異常處理機(jī)制,從基礎(chǔ)的try-except到自定義異常,讓你的程序更加穩(wěn)定和可靠。
?? 什么是異常?
異常(Exception)是程序執(zhí)行過(guò)程中發(fā)生的錯(cuò)誤事件,會(huì)中斷程序的正常流程。Python使用異常對(duì)象來(lái)表示各種錯(cuò)誤情況,如除以零、文件不存在、索引越界等。
?? 基礎(chǔ)語(yǔ)法:try-except
最基本的異常處理結(jié)構(gòu)是try-except語(yǔ)句:
try:
result = 10 / 0
except ZeroDivisionError:
print("不能除以零!")?? 捕獲多種異常
可以捕獲多種不同類(lèi)型的異常:
try:
number = int(input("請(qǐng)輸入一個(gè)數(shù)字:"))
result = 100 / number
except ValueError:
print("輸入無(wú)效!請(qǐng)輸入數(shù)字。")
except ZeroDivisionError:
print("不能除以零!")?? 獲取異常信息
使用as關(guān)鍵字可以獲取異常對(duì)象,查看詳細(xì)信息:
try:
file = open("不存在的文件.txt", "r")
except FileNotFoundError as e:
print(f"錯(cuò)誤信息:{e}")
print(f"錯(cuò)誤類(lèi)型:{type(e).__name__}")? else 和 finally
else塊在沒(méi)有異常時(shí)執(zhí)行,finally塊無(wú)論是否發(fā)生異常都會(huì)執(zhí)行:
try:
file = open("data.txt", "r")
content = file.read()
except FileNotFoundError:
print("文件未找到")
else:
print(f"文件內(nèi)容:{content}")
finally:
print("清理工作完成")
if 'file' in locals():
file.close()?? 捕獲所有異常
使用Exception可以捕獲大部分異常(但不建議濫用):
try:
# 可能出錯(cuò)的代碼
risky_operation()
except Exception as e:
print(f"發(fā)生錯(cuò)誤:{e}")
# 記錄日志或進(jìn)行其他處理?? raise 主動(dòng)拋出異常
使用raise可以主動(dòng)拋出異常:
def check_age(age):
if age < 0:
raise ValueError("年齡不能為負(fù)數(shù)")
if age > 150:
raise ValueError("年齡不現(xiàn)實(shí)")
return age
try:
check_age(-5)
except ValueError as e:
print(f"驗(yàn)證失敗:{e}")?? 自定義異常
通過(guò)繼承Exception類(lèi)創(chuàng)建自定義異常:
class ValidationError(Exception):
"""數(shù)據(jù)驗(yàn)證錯(cuò)誤"""
pass
class InsufficientFundsError(Exception):
"""余額不足錯(cuò)誤"""
def __init__(self, balance, amount):
self.balance = balance
self.amount = amount
super().__init__(f"余額 {balance} 不足,需要 {amount}")
# 使用自定義異常
class BankAccount:
def __init__(self, balance=0):
self.balance = balance
def withdraw(self, amount):
if amount > self.balance:
raise InsufficientFundsError(self.balance, amount)
self.balance -= amount
return self.balance
# 測(cè)試
account = BankAccount(100)
try:
account.withdraw(200)
except InsufficientFundsError as e:
print(f"取款失?。簕e}")
print(f"當(dāng)前余額:{e.balance}")
print(f"請(qǐng)求金額:{e.amount}")?? 異常鏈
使用raise from可以在轉(zhuǎn)換異常時(shí)保留原始異常信息:
def parse_config(data):
try:
return json.loads(data)
except json.JSONDecodeError as e:
raise ConfigError("配置文件格式錯(cuò)誤") from e
# 這樣可以看到完整的異常鏈?? 最佳實(shí)踐
- 精確捕獲:盡量捕獲具體的異常類(lèi)型,而不是泛泛的Exception
- 不要靜默處理:空的except塊會(huì)隱藏問(wèn)題,至少要記錄日志
- 使用finally釋放資源:或使用上下文管理器(with語(yǔ)句)
- 異常信息要清晰:自定義異常時(shí)提供有用的錯(cuò)誤信息
- 不要濫用異常:異常是用于錯(cuò)誤處理,不是流程控制
?? 上下文管理器與異常
with語(yǔ)句自動(dòng)處理資源釋放,即使在異常情況下:
# 不需要手動(dòng)關(guān)閉文件,with會(huì)自動(dòng)處理
with open("data.txt", "r") as file:
content = file.read()
# 即使這里發(fā)生異常,文件也會(huì)被正確關(guān)閉?? 總結(jié)
Python的異常處理機(jī)制提供了強(qiáng)大而靈活的錯(cuò)誤處理能力:
try-except:捕獲和處理異常else:無(wú)異常時(shí)執(zhí)行的代碼finally:無(wú)論是否異常都執(zhí)行的清理代碼raise:主動(dòng)拋出異常- 自定義異常:創(chuàng)建特定領(lǐng)域的錯(cuò)誤類(lèi)型
掌握異常處理,讓你的Python程序更加健壯和專(zhuān)業(yè)!??
到此這篇關(guān)于Python異常處理從try-except到自定義異常的全過(guò)程的文章就介紹到這了,更多相關(guān)Python try-except到自定義異常內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
linux安裝python修改默認(rèn)python版本方法
在本文中我們給大家總結(jié)了關(guān)于linux安裝python修改默認(rèn)python版本的方法和相關(guān)知識(shí)點(diǎn),需要的讀者們參考下。2019-03-03
Python Django框架實(shí)現(xiàn)應(yīng)用添加logging日志操作示例
這篇文章主要介紹了Python Django框架實(shí)現(xiàn)應(yīng)用添加logging日志操作,結(jié)合實(shí)例形式分析了Django框架中添加Python內(nèi)建日志模塊相關(guān)操作技巧,需要的朋友可以參考下2019-05-05
Python+Selenium+Pytesseract實(shí)現(xiàn)圖片驗(yàn)證碼識(shí)別
這篇文章主要介紹了利用Python+Selenium+Pytesseract實(shí)現(xiàn)圖片驗(yàn)證碼識(shí)別,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-01-01
安裝pyhttpx解決ImportError: DLL load failed錯(cuò)誤
這篇文章主要為大家介紹了安裝pyhttpx解決ImportError: DLL load failed錯(cuò)誤,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
django使用圖片延時(shí)加載引起后臺(tái)404錯(cuò)誤
本文給大家介紹的是作者在Django中使用圖片的延時(shí)加載技術(shù)后引起后臺(tái)404錯(cuò)誤的問(wèn)題以及解決思路和方法,有需要的小伙伴可以參考下2017-04-04

