在我們編寫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...