捕獲異常
如果對某些代碼的執行不能確定是否正確,可以用try來捕獲異常
格式爲:
try:
不能確定能否正確執行的代碼
except:
出現錯誤的處理
例:要求用戶輸出整數,結果用戶卻輸入一個字母,這就是在編寫程序沒有語法錯誤的情況下,產生的異常,代碼如下:
try:
#提示用戶輸入一個數字
num = int(input("請輸入數字:"))
except:
print("請輸入正確的數字")
print("_"*50)
當輸入爲數字時,輸入正確,可以打印分割線,輸出結果如下:
當輸入爲字母時,輸入格式是錯的,但是也可以打印分割線,輸出結果如下:
所以,無論程序是否發生錯誤,程序還是會繼續執行下去
錯誤類型捕獲
- 在程序執行時,可能會遇到不同類型的異常,並且需要針對不同類型的異常,做出不同的響應,這個時候,就需要捕獲錯誤類型
- 語法如下:
try:
#嘗試執行的代碼
pass
except 錯誤類型1:
#針對錯誤類型1,對應的代碼處理
pass
except (錯誤類型2, 錯誤類型3):
#針對錯誤類型2 和3,對應的代碼處理
pass
except Exception as result:
print("未知錯誤 %s" % result)
- 當python解釋器拋出異常時,最後一行錯誤信息到的第一個單詞,就是錯誤類型
例:提示用戶輸入一個整數,使用8除以用戶輸入的整數並且輸出
代碼如下:
num = int(input("輸入一個整數:"))
#使用8除以用戶輸入的整數並且輸出
result = 8 / num
print(result)
分析:顯而易見,當分母爲0時,當輸入的爲字母或非整數,是錯誤的
那麼我們就要先輸入一個0,運行,然後得出錯誤的類型,就是最後一行錯誤信息到的第一個單詞,如下:
那麼我們就可以修改代碼爲:
try:
# 提示用戶輸入一個整數
num = int(input("輸入一個整數:"))
#使用8除以用戶輸入的整數並且輸出
result = 8 / num
print(result)
- List item
except ZeroDivisionError:
print("除0錯誤")
運行結果如下:
再通過同樣的方法,以此類推,得出輸入的爲字母或非整數,錯誤類型爲:ValueError ,所以我們修改代碼爲:
# 提示用戶輸入一個整數
num = int(input("輸入一個整數:"))
#使用8除以用戶輸入的整數並且輸出
result = 8 / num
print(result)
except ZeroDivisionError:
print("除0錯誤")
except ValueError:
print("請輸入正確的整數")
當輸入爲字母或非整數時,運行結果如下:
- 但是,在開發時,要預判到所有很能出現的錯誤還是有難度的
- 我們希望程序無論出現何種錯誤,都不會因爲python解釋器拋出異常而被終止,所以,我們可以再增加一個except,語法如下:
except Exception as result:
print("未知錯誤 %s" % result)
現在假設,我們在開發時,沒有提前預判到除0錯誤,我們又想程序無論出現何種錯誤,都不會因爲python解釋器拋出異常而被終止,所以,我們再增加一個except,代碼如下:
try:
# 提示用戶輸入一個整數
num = int(input("輸入一個整數:"))
#使用8除以用戶輸入的整數並且輸出
result = 8 / num
print(result)
except ValueError:
print("請輸入正確的整數")
except Exception as result:
print("未知錯誤 %s" % result)
當輸入0時,運行結果如下:
異常捕獲的完整語法
try:
#嘗試執行的代碼
pass
except 錯誤類型1:
#針對錯誤類型1,對應的代碼處理
pass
except (錯誤類型2, 錯誤類型3):
#針對錯誤類型2 和3,對應的代碼處理
pass
except Exception as result:
#打印錯誤信息
print("未知錯誤 %s" % result)
else:
#沒有異常纔會執行的代碼
pass
finally:
#無論是否有異常,都會執行的代碼
print("無論是否有異常,都會執行的代碼")
繼續完善我們的例子:
try:
# 提示用戶輸入一個整數
num = int(input("輸入一個整數:"))
#使用8除以用戶輸入的整數並且輸出
result = 8 / num
print(result)
except ValueError:
print("請輸入正確的整數")
except Exception as result:
print("未知錯誤 %s" % result)
else:
print("嘗試成功")
finally:
print("無論是否出現錯誤都會執行的代碼")
print("_" * 50)
運行結果如下:
異常的傳遞
- 當一個 函數/方法 出現異常時,會將異常傳遞給 函數/方法 的調用的一方
- 這樣一層一層向上傳遞,傳遞到主程序,仍然沒有異常處理,程序纔會被終止
- 在開發中,可以在主程序中增加異常捕獲
- 而在主程序中調用的其他函數,只要出現異常,都會傳遞到主函數的 異常捕獲 中
- 這樣就不需要在代碼中,增加大量的異常捕獲,這樣能保持代碼的整潔
代碼如下:
def demo1():
return int(input("輸入整數:"))
def demo2():
return demo1()
#利用異常的傳遞性,在主程序中捕獲異常
try:
print(demo2())
except Exception as result:
print("未知錯誤 %s" % result)
運行結果如下:
主動拋出異常
- 在開發中,除了代碼執行出錯python解釋器會拋出異常之外
- 還可以根據應用程序 特有的業務需求 主動拋出異常
主動拋出異常的步驟:
- 使用Exception這個類(Exception這個類是python中專門針對異常提供的類)來創建一個異常對象
- 使用raise關鍵字拋出異常對象
例:定義input_password函數,提示用戶輸入密碼,若用戶輸入長度<8,拋出異常,若用戶輸入長度>=8,則返回輸入的密碼
代碼如下:
def input_password():
#1.提示用戶輸入密碼
pwd = input("請輸入密碼:")
#2.判斷密碼長度>=8,返回用戶輸入的密碼
if len(pwd) >= 8:
return pwd
#3.若密碼長度<8,主動拋出異常
print("主動拋出異常")
#創建異常對象:可以使用錯誤信息字符串作爲參數
ex = Exception("密碼長度不夠")
#主動拋出異常
raise ex
#提示用戶輸入密碼
try:
print(input_password())
except Exception as result:
print(result)
當輸入密碼小於8位時,運行結果如下: