Python學習之路 異常

2021-09-29 09:16:50 字數 2093 閱讀 5927

在我們編寫python程式的過程中,常常會因為各種原因導致我們的程式出現錯誤,這就是程式出現異常。

由於在python程式中,程式一旦出現異常,那麼整個程式會立即終止,異常後面的**都不會執行(異常前面的**會執行,在這裡也體現出python是編譯性語言的特徵)。

為了不讓我們的程式一旦出現出現異常就卡死,我們就需要對程式中可能出現異常的部分進行處理。

當在函式**現異常時,如果在函式中對異常進行了處理,則異常不會再傳播,如果函式中沒有對異常進行處理,則異常會繼續向函式呼叫處傳播。

如果函式在呼叫處處理了異常,則不再傳播;

如果沒有處理則繼續像呼叫處傳播,直到傳遞到全域性作用域,如果依然沒有處理,則程式終止,並且顯示異常資訊。

當程式執行過程**現異常以後,所有的異常資訊會被專門儲存到乙個異常物件當中

而異常傳播時,實際上就是異常物件拋給了呼叫處。

常見異常

異常名出現原因

baseexception

所有異常的基類

exception

常規異常的基類

attributeerror

物件不存在此屬性

indexerror

輸入/輸出操作失敗

keyboardinterrupt

使用者中斷執行

keyerror

對映中不存在此鍵

nameerror

找不到名字(變數)

syntaxerror

python語法錯誤

typeerror

對型別無效的操作

valueerror

傳入無效的引數

zerodivisionerror

除或取模運算的第二個引數為0

connectionerror

與連線相關異常的基類

在python中我們可以利用try-except語句來對異常進行處理。

異常處理語法

try

: **塊(可能會出現錯誤的語句)

except 異常型別 as異常名:

**塊(出現錯誤以後的處理方式)

except 異常型別 as異常名:

**塊(出現錯誤以後的處理方式)..

...else

: **塊(沒有錯誤時要執行的語句)

finally

: **塊(是否有異常都會執行)

在try-eccept語句中,如果except後面不跟任何內容,則此時會捕獲到所有的異常;如果except後面跟著乙個異常型別,那麼此時它只會捕獲該型別的異常。

try

:print(1

/0)except zerodivisionerror:

print

('出現錯誤!'

)

當直接執行"1/0"時,程式會丟擲zerodivisionerror異常。我們利用try-except語句接收異常,然後執行print(『出現錯誤!』)語句,然後就不會丟擲異常了,後面的程式也不會中斷了。

在實際開發過程中,我們可以自己自定義異常物件,在程式不能按照我們的要求執行時就拋出自定義異常。

自定義異常語法

raise

[exception [

, args [

, traceback]

]]

語句中exception是異常的型別(例如,nameerror)。該引數是可選的,如果不提供,異常的引數是"none"。

class

myerror

(exception)

:pass

defadd

(a,b)

:if a <

0or b <0:

raise myerror(

'輸入值不應為負!'

) r = a + b

return r

print

(add(-1

,2))

myerror是我們定義的異常,當程式不符合我們的要求時就丟擲myerror異常。

Python修煉之路 異常

在程式出現bug時一般不會將錯誤資訊直接顯示給使用者,而是可以自定義顯示內容或處理。常見異常 attributeerror 試圖訪問乙個物件沒有的樹形,比如foo.x,但是foo沒有屬性x ioerror 輸入 輸出異常 基本上是無法開啟檔案 importerror 無法引入模組或包 基本上是路徑問...

Python之路 檔案 異常和測試

今天是看python理論部分的最後一塊,檔案的讀寫,python中的異常和用python測試。讀with open 檔名.檔案字尾名 as 檔案物件名 變數名 檔案物件名.read print 變數名 寫with open 檔名.檔案字尾名 w as 檔案物件名 變數名 檔案物件名.write 寫入...

Python學習之路

python 十分鐘入門 python 菜鳥教程 pycharm安裝numpy python 檔案讀取 with open xml path,r as fr content fr.read python讀取檔案時提示 unicodedecodeerror gbk codec can t decode...