python的中異常處理機(jī)制
什么是異常處理
定義:異常處理就是我們?cè)趯慞ython時(shí),經(jīng)常看到的報(bào)錯(cuò)信息,例如;NameError TypeError ValueError等,這些都是異常。
異常是一個(gè)事件,改事件會(huì)在程序執(zhí)行過程中發(fā)生,影響程序的正常執(zhí)行,一般情況下,在python中無法處理程序時(shí)就會(huì)發(fā)生異常,異常時(shí)Python的一個(gè)對(duì)象,表示一個(gè)錯(cuò)誤,當(dāng)Python腳本發(fā)生異常時(shí),我們需要捕獲并處理異常,否則程序就會(huì)終止執(zhí)行。
Python 使用被稱為 異常 的特殊對(duì)象來管理程序執(zhí)行期間發(fā)生的錯(cuò)誤。每當(dāng)發(fā)生讓 Python 不知所措的錯(cuò)誤時(shí),它都會(huì)創(chuàng)建一個(gè)異常對(duì)象。如果你編寫了處理該異常的代碼,程序?qū)⒗^續(xù)運(yùn)行;如果你未對(duì)異常進(jìn)行處理,程序?qū)⑼V?,并顯示一個(gè) traceback ,其中包含有關(guān)異常的報(bào)告。異常是使用 try-except 代碼塊處理的。 try-except 代碼塊讓 Python 執(zhí)行指定的操作,同時(shí)告訴 Python 發(fā)生異常時(shí)怎么辦。使用了 try-except 代碼塊時(shí),即便出現(xiàn)異常,程序也將繼續(xù)運(yùn)行:顯示你編寫的友好的錯(cuò)誤消息,而不是令用戶迷惑的 traceback 。
處理ZeroDivisionError異常
下面來看一種導(dǎo)致 Python 引發(fā)異常的簡單錯(cuò)誤。你可能知道不能將一個(gè)數(shù)字除以 0 ,但我們還是讓 Python 這樣做吧:
print(5/0)
報(bào)錯(cuò):
Traceback (most recent call last):
File "test.py", line 2, in <module>
print(5/0)
ZeroDivisionError: integer division or modulo by zero
使用 try-except 代碼塊
當(dāng)你認(rèn)為可能發(fā)生了錯(cuò)誤時(shí),可編寫一個(gè) try-except 代碼塊來處理可能引發(fā)的異常。你讓 Python 嘗試運(yùn)行一些代碼,并告訴它如果這些代碼引發(fā)了指定的異常,該怎么辦。
處理 ZeroDivisionError 異常的 try-except 代碼塊類似于下面這樣:
try:
print(5/0)
except ZeroDivisionError:
print("You can't divide by zero!")
# You can't divide by zero!
如果 try-except 代碼塊后面還有其他代碼,程序?qū)⒔又\(yùn)行,因?yàn)橐呀?jīng)告訴了 Python 如何處理這種錯(cuò)誤。
使用異常避免崩潰
發(fā)生錯(cuò)誤時(shí),如果程序還有工作沒有完成,妥善地處理錯(cuò)誤就尤其重要。這種情況經(jīng)常會(huì)出現(xiàn)在要求用戶提供輸入的程序中;如果程序能夠妥善地處理無效輸入,就能再提示用戶提供有效輸入,而不至于崩潰。
創(chuàng)建一個(gè)只執(zhí)行除法運(yùn)算的簡單計(jì)算器:
print("Give me two numbers, and I'll divide them.")
print("Enter 'q' to quit.")
while True:
first_number = input("\nFirst number: ")
if first_number == 'q':
break
second_number = input("Second number: ")
try:
answer = int(first_number) / int(second_number)
except ZeroDivisionError:
print("You can't divide by 0!")
else:
print(answer)
try-except-else 代碼塊的工作原理大致如下:
Python 嘗試執(zhí)行 try 代碼塊中的代碼;只有可能引發(fā)異常的代碼才需要放在 try 語句中。有時(shí)候,有一些僅在 try 代碼塊成功執(zhí)行時(shí)才需要運(yùn)行的代碼;這些代碼應(yīng)放在 else 代碼塊中。 except 代碼塊告訴 Python ,如果它嘗試運(yùn)行 try 代碼塊中的代碼時(shí)引發(fā)了指定的異常,該怎么辦。
通過預(yù)測可能發(fā)生錯(cuò)誤的代碼,可編寫健壯的程序,它們即便面臨無效數(shù)據(jù)或缺少資源,也能繼續(xù)運(yùn)行,從而能夠抵御無意的用戶錯(cuò)誤和惡意的攻擊。
處理 FileNotFoundError 異常
FileNotFoundError 錯(cuò)誤是函數(shù) open() 導(dǎo)致的,因此要處理這個(gè)錯(cuò)誤,必須將 try 語句放在包含 open() 的代碼行之前:
filename = 'alice.txt'
try:
with open(filename) as f_obj:
contents = f_obj.read()
except FileNotFoundError:
msg = "Sorry, the file " + filename + " does not exist."
print(msg)
處理多個(gè)文件
def count_words(filename):
""" 計(jì)算一個(gè)文件大致包含多少個(gè)單詞 """
try:
with open(filename) as f_obj:
contents = f_obj.read()
except FileNotFoundError:
msg = "Sorry, the file " + filename + " does not exist."
print(msg)
else:
# 計(jì)算文件大致包含多少個(gè)單詞
words = contents.split()
num_words = len(words)
print("The file " + filename + " has about " + str(num_words) + " words.")
filenames = ['a.txt', 'b.txt', 'c.txt', 'd.txt']
for filename in filenames:
count_words(filename)
異常時(shí)保持靜默
要讓程序在失敗時(shí)一聲不吭,可像通常那樣編寫 try 代碼塊,但在 except 代碼塊中明確地告訴 Python 什么都不要做。 Python 有一個(gè) pass 語句,可在代碼塊中使用它來讓 Python 什么都不要做:
def count_words(filename):
""" 計(jì)算一個(gè)文件大致包含多少個(gè)單詞 """
try:
with open(filename) as f_obj:
contents = f_obj.read()
except FileNotFoundError:
pass
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
解決出現(xiàn)Incorrect integer value: '''' for column ''id'' at row 1
這篇文章主要介紹了解決出現(xiàn)Incorrect integer value: '' for column 'id' at row 1的問題的相關(guān)資料,希望通過本文能幫助到大家,讓大家遇到這樣的問題及時(shí)的解決,需要的朋友可以參考下2017-10-10
python如何派生內(nèi)置不可變類型并修改實(shí)例化行為
這篇文章主要為大家詳細(xì)介紹了python如何派生內(nèi)置不可變類型并修改實(shí)例化行為,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03
python模擬預(yù)測一下新型冠狀病毒肺炎的數(shù)據(jù)
這篇文章主要介紹了python模擬預(yù)測一下新型冠狀病毒肺炎的數(shù)據(jù) ,需要的朋友可以參考下2020-02-02
Python裝飾器入門學(xué)習(xí)教程(九步學(xué)習(xí))
裝飾器(decorator)是一種高級(jí)Python語法。裝飾器可以對(duì)一個(gè)函數(shù)、方法或者類進(jìn)行加工。本文給大家介紹Python裝飾器入門學(xué)習(xí)教程(九步學(xué)習(xí)),對(duì)python裝飾器相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2016-01-01

