python學習筆記 異常處理

2021-08-22 13:48:09 字數 4471 閱讀 5004

什麼是異常

異常就是程式執行時發生錯誤的訊號(在程式出現錯誤時,則會產生乙個異常,若程式沒有處理它,則會

丟擲該異常,程式的執行也隨之終止)

語法錯誤:不按照語言基準來寫

print('hello'
邏輯錯誤

res = 1/0 #zerodivisionerror

l = [1.2]

l[10] #indexerror

age = input('>>:')

age = int(age) #如果輸入字串就會報錯

異常種類

zerodivisionerror

indexerror等。。。。。。

異常結構

traceback->python直譯器追蹤的異常資訊 例如:nameerror->異常類  nameerror後面的是異常值

異常處理

為了保證程式的健壯性與容錯性,即在遇到錯誤時程式不會崩潰,我們需要對異常進行處理

->使用if判斷:

針對錯誤發生的條件是可預知的,在錯誤發生之前預防

#例1

num1 = input('請輸入數字:')

if num1.isdigit():

int(num1) #主邏輯

elif num1.isspace():

print('輸入的是空格')

elif num1.isalpha():

print('輸入的是字母')

elif len(num1) == 0:

print('輸入的是空')

else:

print('其他非法輸入')

#例2def test():

print('test running')

choice_dict =

while true:

choice = input('-->>:').strip()

if not choice or choice not in choice_dict:

continue

choice_dict[choice]()

缺點:①如果有其他num。。數量多的話,會造成重複**以及可讀性很差

②不同**段的相同型別的錯誤需要寫重複的if來進行處理,造成重複**

③與主程式本身無關,與異常處理有關的if太多,造成可讀性太差

python為每一種異常定製了乙個型別,提供了try.except特殊的語法結構來進行異常處理

->使用try.except:

若錯誤發生的條件是不可預知的,可以使用try..except..語句來捕捉異常

#基本語法結構

try:

被檢測的**塊

except:

try中一旦檢測到異常,就執行這個位置的邏輯

#異常類只能用來處理指定的異常情況,如果非指定異常則無法處理

try:

age = input('-->>:')

int(age) #主邏輯

#這兩個發生異常的型別一樣:valueerror

num1 = input('-->>:')

int(num1) #主邏輯

except valueerror as e:

print(e) #報異常valueerror

#->若except後面的異常型別是keyerror,上面的異常捕捉不了,會正常報錯

#多分支

try:

age = input('-->>:')

int(age) #主邏輯

#這兩個發生異常的型別一樣:valueerror

num1 = input('-->>:')

int(num1) #主邏輯

l =

l[100]

dic = {}

dic['name']

except keyerror as e:

print(e)

except valueerror as e:

print(e)

except indexerror as e:

print(e)

#萬能異常 exception

try:

age = input('-->>:')

int(age) #主邏輯

#這兩個發生異常的型別一樣:valueerror

num1 = input('-->>:')

int(num1) #主邏輯

l =

l[100]

dic = {}

dic['name']

except exception as e:

print(e)

#多分支與萬能異常

1.無論什麼異常統一處理,一般使用exception

2.對於不同的異常需要定製不同的處理邏輯,使用多分支

#加上while迴圈,可以讓主程式重複不斷的執行,直到不報異常為止

while true:

try:

age = input('-->>:')

int(age) #主邏輯

break

except exception as e:

print('請重新輸入',e)

print('終於出來了')

#多分支後面加萬能異常

try:

age = input('-->>:')

int(age) #主邏輯

except keyerror as e:

print(e)

except valueerror as e:

print(e)

except indexerror as e:

print(e)

except exception as e: #上面異常型別都沒有捕捉到時,捕捉剩餘其他異常

print(e)

#其他異常結構 else

try:

age = input('-->>:')

int(age) #主邏輯

except keyerror as e:

print(e)

except valueerror as e:

print(e)

except indexerror as e:

print(e)

except exception as e:

print(e)

else:

print('try內**塊沒有異常時執行')

#其他異常結構 finally

try:

age = input('-->>:')

int(age) #主邏輯

except keyerror as e:

print(e)

except valueerror as e:

print(e)

except indexerror as e:

print(e)

except exception as e:

print(e)

else:

print('try內**塊沒有異常時執行')

finally:

print('無論異常與否,都會執行該模組,通常是進行清理工作')

#例如:檔案操作時觸發異常,檔案未關閉,使用finally進行檔案關閉

#主動觸發異常

try:

raise typeerror('型別錯誤')

except exception as e:

print(e)

#自定義異常

class mrhexception(baseexception): #自定義類基於baseexception

def __init__(self,msg):

self.msg = msg

def __str__(self):

return self.msg

#raise mrhexception('自己定製的異常')

#print(mrhexception('自己定製的異常')) #觸發str方法,列印異常資訊

#直接觸發異常類

raise typeerror('型別錯誤') #typeerror: 型別錯誤

#斷言#語法結構:assert 條件

assert 1 == 2 #assertionerror

#相當於下面兩行**

if x != 1:

raise assertionerror

try..except優點:

① 將異常處理和主程式區分開

② 異常可以進行捕捉,程式不容易直接意外崩潰

python學習筆記 異常處理

try 多個except else finally語句 try 塊是此語句的主要動作,嘗試執行的 except分句捕獲且處理try 塊內引發的異常,else分句是try沒有發生異常時要執行的處理器。finally語句不管異常是否發生都會去執行的,如果沒有異常發生,執行完try 塊後執行finally...

python學習筆記 異常處理

assertionerror 斷言語句失敗 attributeerror 嘗試訪問未知的物件屬性 indexerror 索引超出序列的範圍 keyerror 字典中查詢乙個不存在的關鍵字 nameerror 嘗試訪問乙個不存在的變數 oserror 作業系統產生的異常 syntaxerror pyt...

python學習筆記 異常處理

attributeerror 試圖訪問乙個物件沒有的樹形,比如foo.x,但是foo沒有屬性x ioerror 輸入 輸出異常 基本上是無法開啟檔案 importerror 無法引入模組或包 基本上是路徑問題或名稱錯誤 indentationerror 語法錯誤 的子類 沒有正確對齊 indexer...