異常是程式執行時發生錯誤的訊號,每當發生讓python不知所措的錯誤時,都會建立乙個建立乙個異常物件。若異常未處理,程式將停止執行,並顯示乙個traceback
n =
"elk"
# n 儲存的是 "elk" ,再將它轉換成int時,將丟擲乙個異常
int(n)
以下為執行結果:
attributeerror 試圖訪問乙個物件沒有的屬性,比如foo.x,但是foo沒有屬性x
ioerror 輸入/輸出異常;基本上是無法開啟檔案
importerror 無法引入模組或包;基本上是路徑問題或名稱錯誤
indentationerror 語法錯誤(的子類) ;**沒有正確對齊
indexerror 下標索引超出序列邊界,比如當x只有三個元素,卻試圖訪問x[5]
keyerror 試圖訪問字典裡不存在的鍵
keyboardinterrupt ctrl+c被按下
nameerror 使用乙個還未被賦予物件的變數
syntaxerror python**非法,**不能編譯(個人認為這是語法錯誤,寫錯了)
typeerror 傳入物件型別與要求的不符合
unboundlocalerror 試圖訪問乙個還未被設定的區域性變數,基本上是由於另有乙個同名的全域性變數,導致你以為正在訪問它
valueerror 傳入乙個呼叫者不期望的值,即使值的型別是正確的
編寫特定**,捕捉異常,若捕捉成功,進入另乙個處理分支,執行定製邏輯,使程式不會崩潰
num =
10while
true
: n =
input
(">>>"
)if n.isdigit():
#只有當輸入的是數字時,才執行 if 中的**塊
n =int(n)
if n == num:
print
("you guessed right."
)break
else
:print
("input error, please re-enter"
)
基本語法
try:
被檢測**塊
except 異常型別:
try中一旦檢測到異常,將執行此處的邏輯
舉例
try
: n =
input
(">>>"
)int
(n)# 1
except valueerror:
# 2print
("input error"
)print
("over"
)#3
檢測使用者的輸入,如果使用者輸入正確,將不會引發異常,python將跳過except **塊,執行後面的**,本例即3處。
如果使用者輸入的不是數字,在1處 將引發乙個valueerror異常,然後將執行except 中的**塊。
被檢測**可能會引發多個異常,這時候可以使用多分支
try
: n =
input
(">>>"
)int
(n)#1
print
("-"*10
)
li =
[i for i in
range(10
)]print
(li[10]
)#2print
("*"*10
)#3except valueerror as v:
print
(v)except indexerror as i:
print
(i)except nameerror as n:
print
(n)print
("over"
)
在2處 索引超出邊界,將引發乙個indexerror異常
值得注意的是,在2處引發了乙個indexerror異常,3處 的**將不會執行。
此外,異常類只能用來處理指定的異常型別,而非指定異常將無法處理。
異常型別很多對於某些我們不需要指定處理邏輯的異常,可以使用exception
try
: n =
"elk"
int(n)
except exception as e:
print
(e)
可以在多分支後面加乙個exception
當 try 中的**塊沒有引發異常,將執行 else中的**塊
try
: li =
[i for i in
range(10
)]li[0]
except indexerror as i:
print
(i)except exception as e:
print
(e)else
:#沒有異常執行
print
("ok"
)
在 try**塊 中未引發異常,執行 else,列印ok。
被檢測**無論是否引發異常,都會執行 finally 中的**塊
try
: li =
[i for i in
range(10
)]li[0]
except indexerror as i:
print
(i)except exception as e:
print
(e)finally
:#無論是否有異常都將執行
print
("hello"
)
try
: li =
[i for i in
range(10
)]li[10]
except indexerror as i:
print
(i)except exception as e:
print
(e)finally
:#無論是否有異常都將執行
print
("hello"
)
兩次執行結果都將列印hello。
異常也可以被主動觸發
#主動觸發異常
try:
raise typeerror(
'型別錯誤'
)except exception as e:
print
(e)
#自定義異常
class
elkexception
(baseexception)
:def
__init__
(self,msg)
: self.msg=msg
try:
raise elkexception(
'型別錯誤'
)except elkexception as e:
print
(e)
#斷言:assert 條件
assert1==
1assert1==
2#1不等於2,將引發乙個異常
1:把錯誤處理和真正的工作分開來
2:**更易組織,更清晰,複雜的工作任務更容易實現;
3:更安全,不至於由於一些小的疏忽而使程式意外崩潰了。
python基礎之異常
語法 try 嘗試執行的 except 出現錯誤的處理 try 嘗試執行的 except 錯誤型別1 針對錯誤型別1,對應的 處理 except 錯誤型別2,錯誤型別3 針對錯誤型別2和3,對應的 處理 except exception as result print 未知錯誤 s result e...
python基礎之異常
print hello try try中放置的是有可能出現錯誤的 print 10 0 except except中放置的是出錯以後的處理防暑 print 哈哈哈,出錯了 else print 程式正常執行沒有錯誤 print 你好 print 10 0 def fn print hello fn ...
python基礎之異常處理
引入 程式執行時,難免出現bug,當出現bug時,使用者可能很難明白那一堆報錯 到底是個什麼東西,為了讓使用者能更清楚知道錯誤原因或者直接對使用者將此錯誤遮蔽,異常處理就應運而生。格式 try 輸入要執行的 pass except nameerror as err 將該型別的錯誤捕獲 pass ex...