FishC笔记—33 讲 异常处理:你不可能总是对的2
本期內(nèi)容詳解:
try語句:
try-finally語句:
try: 檢測范圍 except Exception[as reason]: 出現(xiàn)異常(Exception)后的處理代碼 finally: 無論如何都會被執(zhí)行的代碼raise語句:
raise 異常的名字
典型課后題
我們使用什么方法來處理程序中出現(xiàn)的異常?`
答:使用 try……except 搭配來捕獲處理程序中出現(xiàn)的異常。
try:檢測范圍來自:bbs.fishc.com except Exception[as reason]:出現(xiàn)異常(Exception)后的處理代碼一個 try 語句可以和多個 except 語句搭配嗎?為什么?
答:可以。因為 try 語句塊中可能出現(xiàn)多類異常,利用多個 except 語句可以分別捕獲并處理我們感興趣的異常。
try: sum = 1 + '1' f = open('我是一個不存在的文檔.txt') print(f.read()) f.close() except OSError as reason: print('文件出錯啦T_T\n錯誤原因是:' + str(reason)) except TypeError as reason: print('類型出錯啦T_T\n錯誤原因是:' + str(reason))你知道如何統(tǒng)一處理多類異常嗎?
答:在 except 后邊使用小括號“()”把多個需要統(tǒng)一處理的異常括起來:
try: int('abc') sum = 1 + '1' f = open('我是一個不存在的文檔.txt') print(f.read()) f.close() except (OSError, TypeError): print('出錯啦T_T\n錯誤原因是:' + str(reason))except 后邊如果不帶任何異常類,Python 會捕獲所有(try 語句塊內(nèi))的異常并統(tǒng)一處理,但小甲魚卻不建議這么做,你知道為什么嗎?
答:因為它會隱藏所有程序員未想到并且未做好準備處理的錯誤,例如用戶輸入ctrl+c試圖終止程序會被解釋為KeyboardInterrupt異常。
如果異常發(fā)生在成功打開文件后,Python 跳到 except 語句執(zhí)行,并沒有執(zhí)行關閉文件的命令(用戶寫入文件的數(shù)據(jù)就可能沒有保存起來),因此我們需要確保無論如何(就算出了異常退出)文件也要被關閉,我們應該怎么做呢?
答:我們可以使用 finally 語句來實現(xiàn),如果 try 語句塊中沒有出現(xiàn)任何運行時錯誤,會跳過 except 語句塊執(zhí)行 finally語句塊的內(nèi)容。
如果出現(xiàn)異常,則會先執(zhí)行 except 語句塊的內(nèi)容再接著執(zhí)行 finally 語句塊的內(nèi)容。總之,finally 語句塊里的內(nèi)容就是確保無論如何都將被執(zhí)行的內(nèi)容!
請恢復以下代碼中馬賽克擋住的內(nèi)容,使得程序執(zhí)行后可以按要求輸出。
代碼:
輸出:
參考答案:
try: for i in range(3): for j in range(3): if i == 2: raise KeyboardInterrupt print(i, j) except KeyboardInterrupt: print('退出啦!')還記得我們第一個小游戲嗎?只要用戶輸入非整型數(shù)據(jù),程序立刻就會蹦出不和諧的異常信息然后崩潰。請使用剛學的異常處理方法修改以下程序,提高用戶體驗。)
答:這里對可能導致異常的 guess = int(temp) 進行監(jiān)測
import random secret = random.randint(1,10) print('------------------我愛魚C工作室------------------') temp = input("不妨猜一下小甲魚現(xiàn)在心里想的是哪個數(shù)字:") try: guess = int(temp) except ValueError: print('輸入錯誤!') guess = secret while guess != secret: temp = input("哎呀,猜錯了,請重新輸入吧:") guess = int(temp) if guess == secret: print("我草,你是小甲魚心里的蛔蟲嗎?!") print("哼,猜中了也沒有獎勵!") else: if guess > secret: print("哥,大了大了~~~") else: print("嘿,小了,小了~~~") print("游戲結束,不玩啦^_^")input() 函數(shù)有可能產(chǎn)生兩類異常:EOFError(文件末尾endoffile,當用戶按下組合鍵 Ctrl+d 產(chǎn)生)和 KeyboardInterrupt(取消輸入,當用戶按下組合鍵 Ctrl+c 產(chǎn)生),再次修改上邊代碼,捕獲處理 input() 的兩類異常,提高用戶體驗。
import random secret = random.randint(1,10) print('------------------我愛魚C工作室------------------') try: temp = input("不妨猜一下小甲魚現(xiàn)在心里想的是哪個數(shù)字:") guess = int(temp) except (ValueError, EOFError, KeyboardInterrupt): print('輸入錯誤!') guess = secret while guess != secret: temp = input("哎呀,猜錯了,請重新輸入吧:") guess = int(temp) if guess == secret: print("我草,你是小甲魚心里的蛔蟲嗎?!") print("哼,猜中了也沒有獎勵!") else: if guess > secret: print("哥,大了大了~~~") else: print("嘿,小了,小了~~~") print("游戲結束,不玩啦^_^")嘗試一個新的函數(shù) int_input(),當用戶輸入整數(shù)的時候正常返回,否則提示出錯并要求重新輸入。
程序?qū)崿F(xiàn)如圖:
把文件關閉放在 finally 語句塊中執(zhí)行還是會出現(xiàn)問題,像下邊這個代碼,當前文件夾中并不存在”My_File.txt”這個文件,那么程序執(zhí)行起來會發(fā)生什么事情呢?你有辦法解決這個問題嗎?
try: f = open('My_File.txt') # 當前文件夾中并不存在"My_File.txt"這個文件T_T print(f.read()) except OSError as reason: print('出錯啦:' + str(reason)) finally: f.close()答:由于finally語句塊里試圖去關閉一個并沒有成功打開的文件,因此會彈出錯誤內(nèi)容如下:
>>> 出錯啦:[Errno 2] No such file or directory: 'My_File.txt' Traceback (most recent call last): File "C:\Users\FishC000\Desktop\test.py", line 7, in <module> f.close() NameError: name 'f' is not defined我們這么修正:
try: f = open('My_File.txt') # 當前文件夾中并不存在"My_File.txt"這個文件T_T print(f.read()) except OSError as reason: print('出錯啦:' + str(reason)) finally: if 'f' in locals(): # 如果文件對象變量存在當前局部變量符號表的話,說明打開成功 f.close()總結
以上是生活随笔為你收集整理的FishC笔记—33 讲 异常处理:你不可能总是对的2的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 博文声明
- 下一篇: 小米笔记本重装win10系统教程