文章目錄
- 例外資訊
- 捕獲例外
- 多重例外處理
- 拋出例外
- 內置例外型別
- 自定義例外型別
例外資訊

Python使用例外類來管理例外資訊,當發生例外的時候,程式會拋出一個例外資訊,自動根據代碼的層次查找例外處理資訊,當代碼發生例外而沒有指定處理例外的方法是,Traceback會列印發生例外時代碼執行堆疊的情況,
Traceback由三部分組成:
- 資訊頭
提醒使用者這是Traceback資訊, - 出錯位置
顯示出錯位置,顯示順序和例外資訊物件傳播方向是相反的, - 例外資訊
顯示例外型別,具體的例外資訊,

捕獲例外
語法:
try:
statements1
except ExceptionType:
statements2
先運行statements1,若沒有例外則不會運行statements2:

否則把例外型別和ExceptionType比較,一致就執行statements2:

捕獲例外不一定要在例外發生的地方捕獲,在例外物件傳播的路徑上捕獲都可以,

捕獲例外的資訊引數:
try:
statements1
except (ExceptionType) as Argument:
statements2

多重例外處理

上面只是一種例外的情況,對于多重例外,總結了3種方法,
-
多次except

-
except后帶括號

-
except后什么也不帶

else:
try:
statements1
except ExceptionType:
statements2
else:
statements3
else陳述句的作用是如果statements1沒有發生例外才會執行statements3,


finally:
try:
statements1
except ExceptionType:
statements2
finally:
statements3
finally陳述句的作用是無論是否發生例外,都會執行statements3,


(
插播反爬資訊)博主CSDN地址:https://wzlodq.blog.csdn.net/
當然了,else和finally可以一起用,


拋出例外

除了代碼錯誤自動拋出例外外,在Python中可以使用raise陳述句來主動拋出例外,
語法:
raise_stmt ::= "raise" [expression ["," expression ["," expression]]]
raise陳述句后面可以接1~3個運算式,第一個第二個分別表示型別和值,第三個不填寫,填寫的話必須是一個traceback物件,
3種常用寫法:
- raise后接實體化物件

- raise后接例外類名

- raise后接例外類和類的初始化引數

內置例外型別
前面提到的好幾種例外型別,實際上都是Python內置的例外型別,
所有的例外都是繼承BaseException,常用的內部例外都繼承Exception,
如下所示,+表示該類是上一層的子類,|用來對齊,比較常見的用注釋標明了,
BaseException
+ SystemExit
+ KeyboardInerrrput
+ Exception
| + GeneratonrExit
| + StopIterration
| + StandardError
| | + ArithmeticError
| | | + FloatingPointError
| | | + OverflowError
| | | + ZeroDivisonErroe # 被除數為0
| | + AssertionError
| | + AttributeError # 訪問物件不存在的屬性
| | + EnvironmentError
| | | + IOError # 寫不存在的檔案或其他IO錯誤
| | | + OSError
| | | | + WindowsError(Windows)
| | | | + VMSError(VMS)
| | + EOFError
| | + ImportError
| | + LookupError
| | | + IndexError # 訪問不存在的串列元素
| | | + KeyError # 訪問字典不存在的Key
| | + MemoryError
| | + NameError # 訪問不存在的變數名稱
| | | + UnboundLocalError
| | + ReferenceError
| | + RuntimeError
| | | + NotImplementedError
| | + SyntaxError
| | | + IndentationError
| | | | + TableError
| | + SystemError
| | + TypeError # 型別使用了不支持的操作
| | + ValueError
| | + UnicodeError
| | | | + UnicodeDecodeError
| | | | + UnicodeEncodeError
| | | | + UnicodeTranslateError
+ Warning
| + DeprecationWarning
| + PendingDeprecationWarning
| + RuntimeWarning
| + SyntaxWarning
| + UserWarning
| + FutureWarning
+ ImportWarning
+ UnicodeWarning
自定義例外型別
除了上述Python內置的例外型別外,我們也可以自定義例外型別,
雖無強制,但一般會宣告自定義的例外類繼承Exception,

一般參考Python內置類,定義一個總例外類,然后具體的每種例外繼承自該類,
例如一個計算機程式將內部錯誤分為用戶輸入錯誤和內部邏輯錯誤兩部分:
class BusiError(Exception):
"""程式例外錯誤資訊總類"""
pass
class UserInputError(BusiError):
"""用戶輸入資訊錯誤"""
def __init__(self,value):
self.value=value
class InnerdealError(BusiError):
"""內部邏輯錯誤"""
def __init__(self,class_type):
self.class_type=class_type
try:
print('statements1')
except(BusiError) as e:
if type(e).__name__=="UserInputError":
print('statements2')
elif type(e).__name__=="InnerdealError":
print('statements3')
這樣當不知道statements1產生的具體例外時,可以使用BusiError基類來捕獲物件,再根據物件型別的名字就可以知道具體是什么例外了,

Python系列博客持續更新中
原創不易,請勿轉載(
本不富裕的訪問量雪上加霜)
博主首頁:https://wzlodq.blog.csdn.net/
微信公眾號:唔仄lo咚鏘
如果文章對你有幫助,記得一鍵三連?
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/258431.html
標籤:python
