【目錄】
一、什么是例外
二、為何要處理例外
三、如何處理例外
一、什么是例外
(1)什么是例外
例外是程式發生錯誤的信號,程式一旦出錯就會拋出例外,程式的運行隨即終止
(2)例外處理的三個特征
# 例外的追蹤資訊
# 例外的型別
# 例外的內容

二、為何要處理例外
為了增強程式的健壯性,即便是程式運行程序中出錯了,也不要終止程式
而是捕捉例外并處理:將出錯資訊記錄到日志內
三、如何處理例外
1、語法上的錯誤——SyntaxError
處理方式:必須在程式運行前就改正
【錯誤栗子】
if 1>3 # 少了冒號 : print("run...")
【改正版】
if 1>3: print("run...")
2、邏輯上的錯誤
(1)【常見邏輯錯誤型別】
#1 print(x) # NameError: name 'x' is not defined #2 l=['a','b'] l[2] # IndexError: list index out of range #3 1/0 # ZeroDivisionError: division by zero #4 int('abc') # ValueError: invalid literal for int() with base 10: 'abc' #5 dic={'name':'egon'} dic['age'] # KeyError: 'age' #6 class Foo: pass Foo.x # AttributeError: type object 'Foo' has no attribute 'x'
(2) 針對邏輯上的例外又分成兩種處理方式
1)錯誤發生條件可預知的邏輯錯誤,使用if判斷來解決
【錯誤版】
age = input('請輸入你猜的年齡:') age = int(age) if age > 18: print('猜大了') elif age < 18: print('猜小了') else: print('猜對了') # 輸出結果1: # 請輸入你猜的年齡:18 # 猜對了 # 輸出結果2: # 請輸入你猜的年齡:adcd # Traceback (most recent call last): # File "C:/PyCharm 2019.3.3/02020Python/超級代碼匯總集/week7/4-16.py", line 3, in <module> # age = int(age) # ValueError: invalid literal for int() with base 10: 'adcd'
【正確版】
age=input('>>: ').strip() # 輸入的只要不是數字就會出錯 if age.isdigit(): age=int(age) if age > 18: print('猜大了') elif age < 18: print('猜大了') else: print('猜對了') else: print('必須輸入數字')
2)錯誤發生條件不可預知的邏輯錯誤——組合使用 try…except…else…finally 進行解決
# 語法栗子:
print('start...')
try:
# 有可能會拋出例外的代碼
子代碼1
子代碼2
子代碼3
except 例外型別1 as e:
pass
except 例外型別2 as e:
pass
...
else:
如果被檢測的子代碼塊沒有例外發生,則會執行else的子代碼
finally:
無論被檢測的子代碼塊有無例外發生,都會執行finally的子代碼
print('end...')
# 用法一:try…except 例外1 …
print('start...') try: print('1111111111') l=['aaa','bbbb'] l[3] # 拋出例外IndexError,該行代碼同級別的后續代碼不會運行 print('2222222222') xxx print('33333333') dic={'a':1} dic['a'] except IndexError as e: # as e 也可以不寫
print('例外的資訊: ',e) print('end....') # 輸出結果: # start... # 1111111111 # 例外的資訊: list index out of range # end....
# 用法二: try…except 例外1…except 例外2 …
print('start...') try: print('1111111111') l=['aaa','bbbb'] # l[3] # 拋出例外IndexError,該行代碼同級別的后續代碼不會運行 print('2222222222') xxx print('33333333') dic={'a':1} dic['a'] except IndexError as e: print('例外的資訊: ',e) except NameError as e: print('例外的資訊: ',e) print('end....') # 輸出結果: # start... # 1111111111 # 2222222222 # 例外的資訊: name 'xxx' is not defined # end....
# 用法三:except Exception ——萬能例外
print('start...') try: print('1111111111') l = ['aaa', 'bbbb'] l[3] # 拋出例外IndexError,該行代碼同級別的后續代碼不會運行 print('2222222222') xxx print('33333333') dic = {'a': 1} dic['aaa'] # except (IndexError, NameError) as e: # print('例外的資訊: ', e) # except KeyError as e: # print('字典的key不存在: ', e) except Exception as e: # 萬能例外 print('所有例外都可以匹配的到') print('end....') # 輸出結果: # start... # 1111111111 # 所有例外都可以匹配的到 # end....
# 用法四:else不能單獨與try配合使用,必須要搭配except
print('start...') try: print('1111111111') print('2222222222') print('33333333') except Exception as e: # 萬能例外 print('所有例外都可以匹配的到') else: print('====>') print('end....')
# 用法五:finally可以單獨與try配合使用——
finally不處理例外,無論是否發生例外,都會執行finally的子代碼
print('start...') try: print('1111111111') l = ['aaa', 'bbbb'] l[3] # 拋出例外IndexError,該行代碼同級別的后續代碼不會運行 print('2222222222') xxx print('33333333') dic = {'a': 1} dic['aaa'] finally: # 不處理例外,無論是否發生例外都會執行finally的子代碼 print('====》》》》》應該把被檢測代碼中回收系統資源的代碼放到這里') print('end....')
# 輸出結果: start... 1111111111 ====》》》》》應該把被檢測代碼中回收系統資源的代碼放到這里 Traceback (most recent call last): File "C:/PyCharm 2019.3.3/02020Python/超級代碼匯總集/week7/4-16.py", line 199, in <module> l[3] # 拋出例外IndexError,該行代碼同級別的后續代碼不會運行 IndexError: list index out of range
參考資料:
https://zhuanlan.zhihu.com/p/109340070
https://www.cnblogs.com/linhaifeng/articles/6232220.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/157919.html
標籤:Python
下一篇:判斷IP地址的合法性
