您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關Python基礎教程之異常的示例分析的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
一、摘要
Python使用被稱為異常 的特殊對象來管理程序執行期間發生的錯誤。每當發生讓Python不知所措的錯誤時,它都會創建一個異常對象。如果你編寫了處理該異常的代碼,程序將繼續運行;如果你未對異常進行處理,程序將停止,并顯示一個traceback,其中包含有關異常的報告。
異常是使用try-except 代碼塊處理的。try-except 代碼塊讓Python執行指定的操作,同時告訴Python發生異常時怎么辦。使用了try-except 代碼塊時,即便出現異常,程序也將繼續運行:顯示你編寫的友好的錯誤消息,而不是令用戶迷惑的traceback
二、異常實操
處理ZeroDivisionError 異常:try-except&try-except-else
在上述traceback中,指出的錯誤ZeroDivisionError 是一個異常對象。Python無法按你的要求做時,就會創建這種對象。在這種情況下,Python將停止運行程序,并指出引發了哪種異常,而我們可根據這些信息對程序進行修改。下面我們將使用try-except告訴Python,發生這種錯誤時怎么辦
將導致錯誤的代碼行print(5/0) 放在了一個try 代碼塊中。如果try 代碼塊中的代碼運行起來沒有問題,Python將跳過except 代碼塊;如果try 代碼塊中的代碼導致了錯誤,Python將查找這樣的except 代碼塊,并運行其中的代碼,即其中指定的錯誤與引發的錯誤相同,在這個示例中,try 代碼塊中的代碼引發了ZeroDivisionError 異常,因此Python指出了該如何解決問題的except 代碼塊,并運行其中的代碼。這樣,用戶看到的是一條友好的錯誤消息,而不是traceback,如果try-except 代碼塊后面還有其他代碼,程序將接著運行,因為已經告訴了Python如何處理這種錯誤
使用異常避免崩潰:
發生錯誤時,如果程序還有工作沒有完成,妥善地處理錯誤就尤其重要。這種情況經常會出現在要求用戶提供輸入的程序中;如果程序能夠妥善地處理無效輸入,就能再提示用戶提供有效輸入,而不至于崩潰。
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: ") if second_number == 'q': break answer = int(first_number) / int(second_number) print(answer)
這個程序沒有采取任何處理錯誤的措施,因此讓它執行除數為0的除法運算時,它將崩潰:
Give me two numbers, and I'll divide them. Enter 'q' to quit. First number: 5 Second number: 0 Traceback (most recent call last): File "division.py", line 9, in <module> answer = int(first_number) / int(second_number) ZeroDivisionError: division by zero
程序崩潰可不好,但讓用戶看到traceback也不是好主意。不懂技術的用戶會被它們搞糊涂,而且如果用戶懷有惡意,他會通過traceback獲悉你不希望他知道的信息。例如,他將知道你的程序文件的名稱,還將看到部分不能正確運行的代碼。有時候,訓練有素的攻擊者可根據這些信息判斷出可對你的代碼發起什么樣的攻擊。
通過將可能引發錯誤的代碼放在try-except 代碼塊中,可提高這個程序抵御錯誤的能力。錯誤是執行除法運算的代碼行導致的,因此我們需要將它放到try-except 代碼塊中。這個示例還包含一個else 代碼塊;依賴于try 代碼塊成功執行的代碼都應放到else 代碼塊中:
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)
讓Python嘗試執行try 代碼塊中的除法運算,這個代碼塊只包含可能導致錯誤的代碼。依賴于try 代碼塊成功執行的代碼都放在else 代碼塊中;在這個示例中,如果除法運算成功,我們就使用else 代碼塊來打印結果。except 代碼塊告訴Python,出現ZeroDivisionError 異常時該怎么辦。如果try 代碼塊因除零錯誤而失敗,我們就打印一條友好的消息,告訴用戶如何避免這種錯誤。程序將繼續運行,用戶根本看不到traceback:
Give me two numbers, and I'll divide them. Enter 'q' to quit. First number: 5 Second number: 0 You can't divide by 0! First number: 5 Second number: 2 2.5 First number: q
try-except-else 代碼塊的工作原理大致如下:Python嘗試執行try 代碼塊中的代碼;只有可能引發異常的代碼才需要放在try 語句中。有時候,有一些僅在try 代碼塊成功執行時才需要運行的代碼;這些代碼應放在else 代碼塊中。except 代碼塊告訴Python,如果它嘗試運行try 代碼塊中的代碼時引發了指定的異常,該怎么辦。通過預測可能發生錯誤的代碼,可編寫健壯的程序,它們即便面臨無效數據或缺少資源,也能繼續運行,從而能夠抵御無意的用戶錯誤和惡意的攻擊。
處理FileNotFoundError 異常:
使用文件時,一種常見的問題是找不到文件:你要查找的文件可能在其他地方、文件名可能不正確或者這個文件根本就不存在。對于所有這些情形,都可使用try-except 代碼塊以直觀的方式進行處理
filename = 'alice.txt' with open(filename) as f_obj: contents = f_obj.read()
當我們嘗試打開的文件(alice.txt)不存在時,python會報如下異常:
Traceback (most recent call last): File "alice.py", line 3, in <module> with open(filename) as f_obj: FileNotFoundError: [Errno 2] No such file or directory: 'alice.txt'
在上述traceback中,最后一行報告了FileNotFoundError 異常,這是Python找不到要打開的文件時創建的異常。在這個示例中,這個錯誤是函數open() 導致的,因此要處理這個錯誤,必須將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)
分析文本:
split()函數,看看下邊的例子,這個函數干了什么
>>> title = "Alice in Wonderland" >>> title.split() ['Alice', 'in', 'Wonderland']
split() 以空格為分隔符將字符串分拆成多個部分,并將這些部分都存儲到一個列表中。結果是一個包含字符串中所有單詞的列表,雖然有些單詞可能包含標點。為計算Alice in Wonderland 包含多少個單詞,我們將對整篇小說調用split() ,再計算得到的列表包含多少個元素,從而確定整篇童話大致包含多少個單詞
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) else: # 計算文件大致包含多少個單詞 words = contents.split() num_words = len(words) print("The file " + filename + " has about " + str(num_words) + " words.")
將文件alice.txt移到了正確的目錄中,讓try 代碼塊能夠成功地執行。對變量contents (它現在是一個長長的字符串,包含童話 Alice in Wonderland 的全部文本)調用方法split() ,以生成一個列表,其中包含這部童話中的所有單詞。當我們使用len() 來確定這個列表的長度時,就知道了原始字符串大致包含多少個單詞,我們打印一條消息,指出文件包含多少個單詞,這些代碼都放在else 代碼塊中,因為僅當try 代碼塊成功執行時才執行它們。輸出指出了文件alice.txt包含多少個單詞
使用多個文件:
def count_words(filename): """計算一個文件大致包含多少個單詞""" try: with open(filename) as f_obj: contents = f_obj.read() except FileNotFoundError: msg = "Sorry, the file " + filename + " does not exist." print(msg) else: # 計算文件大致包含多少個單詞 words = contents.split() num_words = len(words) print("The file " + filename + " has about " + str(num_words) + " words.") filename = 'alice.txt' count_words(filename)
然后編寫一個循環,調用這個函數讓他分析多個文件:
filenames = ['alice.txt', 'siddhartha.txt', 'moby_dick.txt', 'little_women.txt'] for filename in filenames: count_words(filename)
在filenames列表中的siddhartha.txt文件是不存在的,我們的程序也能正常運行,使用try-except 代碼塊提供了兩個重要的優點:避免讓用戶看到traceback;讓程序能夠繼續分析能夠找到的其他文件。如果不捕獲因找不到siddhartha.txt而引發的FileNotFoundError 異常,用戶將看到完整的traceback,而程序將在嘗試分析 Siddhartha 后停止運行——根本不分析 Moby Dick 和 Little Women
在前一個示例中,我們告訴用戶有一個文件找不到。但并非每次捕獲到異常時都需要告訴用戶,有時候你希望程序在發生異常時一聲不吭,就像什么都沒有發生一樣繼續運行。要讓程序在失敗時一聲不吭,可像通常那樣編寫try 代碼塊,但在except 代碼塊中明確地告訴Python什么都不要做。Python有一個pass 語句,可在代碼塊中使用它來讓Python什么都不要做
def count_words(filename): """計算一個文件大致包含多少個單詞""" try: --snip-- except FileNotFoundError: pass else: --snip-- filenames = ['alice.txt', 'siddhartha.txt', 'moby_dick.txt', 'little_women.txt'] for filename in filenames: count_words(filename)
相比于前一個程序,這個程序唯一不同的地方是pass 語句。現在,出現FileNotFoundError 異常時,將執行except 代碼塊中的代碼,但什么都不會發生。這種錯誤發生時,不會出現traceback,也沒有任何輸出。用戶將看到存在的每個文件包含多少個單詞,但沒有任何跡象表明有一個文件未找到
pass 語句還充當了占位符,它提醒你在程序的某個地方什么都沒有做,并且以后也許要在這里做些什么。例如,在這個程序中,我們可能決定將找不到的文件的名稱寫入到文件missing_files.txt中。用戶看不到這個文件,但我們可以讀取這個文件,進而處理所有文件找不到的問題
感謝各位的閱讀!關于“Python基礎教程之異常的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。