目錄
- try介紹與語法格式
- try具體使用案例
- except的異常類型
- 簡介
- 案例
- 內置的常見異常類型
- 自定義異常類型
- 繼承關系
- 用途
- 注意事項
try介紹與語法格式
在 Python 里,try
語句主要用于異常處理,其作用是捕獲并處理代碼運行期間可能出現的異常,避免程序因異常而意外終止。try
語句通常會和 except
、else
以及 finally
子句搭配使用。具體語法框架如下:
try:# 可能會引發異常的代碼塊pass
except ExceptionType1:# 處理特定類型異常的代碼塊pass
except ExceptionType2:# 處理另一種特定類型異常的代碼塊pass
else:# 當 try 代碼塊沒有引發異常時執行的代碼塊pass
finally:# 無論 try 代碼塊是否引發異常,都會執行的代碼塊pass
在 Python 里,pass
是一個空語句,它不執行任何操作,主要用于占位,保證代碼的語法完整性。
try具體使用案例
下面結合前面讀取 .xlsx 文件的代碼詳細講解其用法:
import openpyxldef read_xlsx(file_path):try:# 以二進制模式打開 .xlsx 文件workbook = openpyxl.load_workbook(file_path)# 獲取活動工作表sheet = workbook.active# 遍歷工作表中的每一行for row in sheet.iter_rows(values_only=True):print(row)except FileNotFoundError:print(f"錯誤:未找到文件 {file_path}。")except Exception as e:print(f"發生未知錯誤:{e}")if __name__ == "__main__":file_path = 'example.xlsx'read_xlsx(file_path)
-
try
代碼塊包含了可能會引發異常的代碼。在這個例子中,openpyxl.load_workbook(file_path)
嘗試打開指定路徑的.xlsx
文件,若文件不存在或者文件格式有誤,就可能會引發異常。 -
后續的代碼如獲取活動工作表和遍歷工作表中的行,在文件打開成功后執行,同樣可能會因為文件內容不規范等原因引發異常。
-
except FileNotFoundError
:專門處理FileNotFoundError
異常,也就是當指定的文件不存在時,會執行該代碼塊中的語句,打印出錯誤信息。 -
except Exception as e
:這是一個通用的異常處理塊,會捕獲除FileNotFoundError
之外的其他所有異常,并將異常信息存儲在變量e
中,然后打印出未知錯誤信息。
except的異常類型
簡介
在 Python 里,try-except
語句會依據 try
代碼塊拋出的異常類型來判定執行哪個 except
子句。當 try
代碼塊出現異常時,Python 會按順序檢查每個 except
子句,查看其指定的異常類型是否與拋出的異常類型相匹配。若匹配成功,就會執行該 except
子句里的代碼。
案例
下面給出一個示例,借助打印信息來明確執行了哪個 except
子句:
try:# 可能會引發異常的代碼塊result = 1 / 0 # 這里會引發 ZeroDivisionError
except ZeroDivisionError:# 處理特定類型異常的代碼塊print("執行了 ZeroDivisionError 異常處理")
except ValueError:# 處理另一種特定類型異常的代碼塊print("執行了 ValueError 異常處理")
else:# 當 try 代碼塊沒有引發異常時執行的代碼塊print("try 代碼塊沒有引發異常")
finally:# 無論 try 代碼塊是否引發異常,都會執行的代碼塊print("finally 代碼塊始終會執行")
在這個示例中,try
代碼塊里的 1 / 0
會引發 ZeroDivisionError
異常。所以,Python 會檢查各個 except
子句,發現 ZeroDivisionError
匹配第一個 except
子句,進而執行該子句里的代碼,輸出 “執行了 ZeroDivisionError
異常處理”。
內置的常見異常類型
以下是Python中常見的可被except
捕獲的內置異常類型匯總表格(基于Exception
基類體系):
自定義異常類型
自定義異常需要繼承自 Python 的內置異常類,通常是 Exception
類。下面是一個自定義異常的示例:
# 定義一個自定義異常類
class MyCustomError(Exception):passtry:# 模擬拋出自定義異常raise MyCustomError("這是一個自定義異常")
except MyCustomError as e:print(f"捕獲到自定義異常: {e}")
在上述代碼中,MyCustomError
是自定義的異常類,它繼承自 Exception
類。在 try
代碼塊中使用 raise
關鍵字拋出這個自定義異常,然后在 except
語句中捕獲并處理它。
繼承關系
Exception
類繼承自 BaseException
,不過像 SystemExit
、KeyboardInterrupt
和 GeneratorExit
這類系統退出相關的異常直接繼承自 BaseException
,而非 Exception
。這意味著 Exception
類涵蓋的是常規的程序運行時錯誤,并非用于處理系統層面的退出事件。
用途
- 捕獲通用異常:在編寫代碼時,若不確定會出現哪種具體的異常,可使用
Exception
類來捕獲所有常規異常。 - 創建自定義異常:可以通過繼承
Exception
類來創建自定義的異常類,從而在特定場景下拋出這些自定義異常。
注意事項
- 慎用
except Exception
:雖然except Exception
能捕獲所有常規異常,但可能會掩蓋一些本應被關注的特定異常,使調試變得困難。因此,在可能的情況下,最好捕獲具體的異常類型。 - 自定義異常的命名:自定義異常類的命名應清晰地反映其用途,通常以
Error
結尾,比如
DatabaseError
、ValidationError
等。