day21 03 異常處理 1.什麼是異常 異常:程式運行時發生錯誤的信號 錯誤:語法錯誤(一般是不能處理的異常) 邏輯錯誤(可處理的異常) 特點:程式一旦發生錯誤,就從錯誤的位置停下來,不再繼續執行後面的內容 2.怎麼處理異常呢? 比如下麵類型代碼的異常: 如果執行後用戶輸入的不是數據就會報錯: ...
day21 03 異常處理
1.什麼是異常
異常:程式運行時發生錯誤的信號
錯誤:語法錯誤(一般是不能處理的異常)
邏輯錯誤(可處理的異常)
特點:程式一旦發生錯誤,就從錯誤的位置停下來,不再繼續執行後面的內容
2.怎麼處理異常呢?
比如下麵類型代碼的異常:
ret=int(input('number >>>')) print(ret*'*')
如果執行後用戶輸入的不是數據就會報錯:
number >>>a Traceback (most recent call last): File "<encoding error>", line 1, in <module> ValueError: invalid literal for int() with base 10: 'a'
可以看到這個錯誤類型是:ValueError
處理的方法:
try:#異常處理語句 ret=int(input('number >>>'))#把認為有異常錯誤需要處理的內容放在try.....except 錯誤類型的機制裡面 print(ret*'*') except ValueError:#捕獲錯誤的類型 異常處理語句,只能處理對應的錯誤
print('您輸入的內容錯誤,請輸入一個數字')
當再次輸入錯誤的內容時,它不會標紅報錯,而是給你提示,就顯得比較友好:
number >>>a
您輸入的內容錯誤,請輸入一個數字
使用try和except就能處理異常:
try是我們要處理的代碼,從前面開始執行,如果有多個錯誤,遇到第一個錯誤時就停止了,後面的錯誤就不會處理了
except後面跟一個錯誤類型,當代碼發生錯誤且錯誤類型符合的時候,就會執行except中的代碼
except是支持多分支
有沒有一個能處理所有錯誤的類型萬能機制:Exception:
只告訴了在哪裡錯了,但是你不知道在哪裡出錯了,比較籠統
所以有了這個萬能處理機制,仍需要把能預測到的問題單獨處理
單獨處理的所有內容都應該寫在萬能異常之前
try: print('111') 1/0 [][3] int('a') {}['key'] print('222') ret=int(input('number >>>')) print(ret*'*') except Exception: print('你錯了,老鐵') except ValueError: print('您輸入的內容錯誤,請輸入一個數字') #如果將這個分支放到萬能異常的後面,如果有錯誤,就會先找到萬能異常機制,就不會走下麵分支了, # 也就不會具體提醒了,即這個分支也就失效了
111
你錯了,老鐵
如果將分支機制放在萬能機制的前面,當try裡面真的有分支對應的錯誤類型的時候就會具體給出提示
else:沒有異常執行else裡面的代碼
try: ret=int(input('number >>>')) print(ret*'*') except ValueError: print('您輸入的內容錯誤,請輸入一個數字') except KeyError: print('請輸入正確的格式') except Exception: print('你錯了,老鐵') else: print('沒有異常的時候執行else裡面的代碼')
假如輸入一個正確的:
number >>>5
*****
沒有異常的時候執行else裡面的代碼
finally:不管代碼是否異常,都會執行
try: ret=int(input('number >>>')) print(ret*'*') except ValueError: print('您輸入的內容錯誤,請輸入一個數字') except KeyError: print('請輸入正確的格式') except Exception: print('你錯了,老鐵') else: print('沒有異常的時候執行try裡面的代碼') finally: print('====')
假如輸入一個正確的:
number >>>10
**********
沒有異常的時候執行try裡面的代碼
====
輸入一個錯誤的:
number >>>a
您輸入的內容錯誤,請輸入一個數字
==== #輸入的a不符合還是會執行