最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python基礎(chǔ)教程之異常詳解

 更新時間:2019年01月10日 11:19:55   作者:davieyang  
調(diào)試Python程序時,經(jīng)常會報出一些異常,下面這篇文章就來給大家介紹了關(guān)于Python基礎(chǔ)教程之異常的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下

一、摘要

Python使用被稱為異常 的特殊對象來管理程序執(zhí)行期間發(fā)生的錯誤。每當(dāng)發(fā)生讓Python不知所措的錯誤時,它都會創(chuàng)建一個異常對象。如果你編寫了處理該異常的代碼,程序?qū)⒗^續(xù)運行;如果你未對異常進行處理,程序?qū)⑼V?,并顯示一個traceback,其中包含有關(guān)異常的報告。

異常是使用try-except 代碼塊處理的。try-except 代碼塊讓Python執(zhí)行指定的操作,同時告訴Python發(fā)生異常時怎么辦。使用了try-except 代碼塊時,即便出現(xiàn)異常,程序也將繼續(xù)運行:顯示你編寫的友好的錯誤消息,而不是令用戶迷惑的traceback

二、異常實操

處理ZeroDivisionError 異常:try-except&try-except-else


在上述traceback中,指出的錯誤ZeroDivisionError 是一個異常對象。Python無法按你的要求做時,就會創(chuàng)建這種對象。在這種情況下,Python將停止運行程序,并指出引發(fā)了哪種異常,而我們可根據(jù)這些信息對程序進行修改。下面我們將使用try-except告訴Python,發(fā)生這種錯誤時怎么辦

將導(dǎo)致錯誤的代碼行print(5/0) 放在了一個try 代碼塊中。如果try 代碼塊中的代碼運行起來沒有問題,Python將跳過except 代碼塊;如果try 代碼塊中的代碼導(dǎo)致了錯誤,Python將查找這樣的except 代碼塊,并運行其中的代碼,即其中指定的錯誤與引發(fā)的錯誤相同,在這個示例中,try 代碼塊中的代碼引發(fā)了ZeroDivisionError 異常,因此Python指出了該如何解決問題的except 代碼塊,并運行其中的代碼。這樣,用戶看到的是一條友好的錯誤消息,而不是traceback,如果try-except 代碼塊后面還有其他代碼,程序?qū)⒔又\行,因為已經(jīng)告訴了Python如何處理這種錯誤

使用異常避免崩潰:

發(fā)生錯誤時,如果程序還有工作沒有完成,妥善地處理錯誤就尤其重要。這種情況經(jīng)常會出現(xiàn)在要求用戶提供輸入的程序中;如果程序能夠妥善地處理無效輸入,就能再提示用戶提供有效輸入,而不至于崩潰。

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)

這個程序沒有采取任何處理錯誤的措施,因此讓它執(zhí)行除數(shù)為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也不是好主意。不懂技術(shù)的用戶會被它們搞糊涂,而且如果用戶懷有惡意,他會通過traceback獲悉你不希望他知道的信息。例如,他將知道你的程序文件的名稱,還將看到部分不能正確運行的代碼。有時候,訓(xùn)練有素的攻擊者可根據(jù)這些信息判斷出可對你的代碼發(fā)起什么樣的攻擊。

通過將可能引發(fā)錯誤的代碼放在try-except 代碼塊中,可提高這個程序抵御錯誤的能力。錯誤是執(zhí)行除法運算的代碼行導(dǎo)致的,因此我們需要將它放到try-except 代碼塊中。這個示例還包含一個else 代碼塊;依賴于try 代碼塊成功執(zhí)行的代碼都應(yīng)放到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嘗試執(zhí)行try 代碼塊中的除法運算,這個代碼塊只包含可能導(dǎo)致錯誤的代碼。依賴于try 代碼塊成功執(zhí)行的代碼都放在else 代碼塊中;在這個示例中,如果除法運算成功,我們就使用else 代碼塊來打印結(jié)果。except 代碼塊告訴Python,出現(xiàn)ZeroDivisionError 異常時該怎么辦。如果try 代碼塊因除零錯誤而失敗,我們就打印一條友好的消息,告訴用戶如何避免這種錯誤。程序?qū)⒗^續(xù)運行,用戶根本看不到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嘗試執(zhí)行try 代碼塊中的代碼;只有可能引發(fā)異常的代碼才需要放在try 語句中。有時候,有一些僅在try 代碼塊成功執(zhí)行時才需要運行的代碼;這些代碼應(yīng)放在else 代碼塊中。except 代碼塊告訴Python,如果它嘗試運行try 代碼塊中的代碼時引發(fā)了指定的異常,該怎么辦。通過預(yù)測可能發(fā)生錯誤的代碼,可編寫健壯的程序,它們即便面臨無效數(shù)據(jù)或缺少資源,也能繼續(xù)運行,從而能夠抵御無意的用戶錯誤和惡意的攻擊。

處理FileNotFoundError 異常:

使用文件時,一種常見的問題是找不到文件:你要查找的文件可能在其他地方、文件名可能不正確或者這個文件根本就不存在。對于所有這些情形,都可使用try-except 代碼塊以直觀的方式進行處理

filename = 'alice.txt'
with open(filename) as f_obj:
 contents = f_obj.read()

當(dāng)我們嘗試打開的文件(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找不到要打開的文件時創(chuàng)建的異常。在這個示例中,這個錯誤是函數(shù)open() 導(dǎo)致的,因此要處理這個錯誤,必須將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()函數(shù),看看下邊的例子,這個函數(shù)干了什么

>>> title = "Alice in Wonderland"
>>> title.split()
['Alice', 'in', 'Wonderland']

split() 以空格為分隔符將字符串分拆成多個部分,并將這些部分都存儲到一個列表中。結(jié)果是一個包含字符串中所有單詞的列表,雖然有些單詞可能包含標(biāo)點。為計算Alice in Wonderland 包含多少個單詞,我們將對整篇小說調(diào)用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 代碼塊能夠成功地執(zhí)行。對變量contents (它現(xiàn)在是一個長長的字符串,包含童話 Alice in Wonderland 的全部文本)調(diào)用方法split() ,以生成一個列表,其中包含這部童話中的所有單詞。當(dāng)我們使用len() 來確定這個列表的長度時,就知道了原始字符串大致包含多少個單詞,我們打印一條消息,指出文件包含多少個單詞,這些代碼都放在else 代碼塊中,因為僅當(dāng)try 代碼塊成功執(zhí)行時才執(zhí)行它們。輸出指出了文件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)

然后編寫一個循環(huán),調(diào)用這個函數(shù)讓他分析多個文件:

filenames = ['alice.txt', 'siddhartha.txt', 'moby_dick.txt', 'little_women.txt']
for filename in filenames:
 count_words(filename)

在filenames列表中的siddhartha.txt文件是不存在的,我們的程序也能正常運行,使用try-except 代碼塊提供了兩個重要的優(yōu)點:避免讓用戶看到traceback;讓程序能夠繼續(xù)分析能夠找到的其他文件。如果不捕獲因找不到siddhartha.txt而引發(fā)的FileNotFoundError 異常,用戶將看到完整的traceback,而程序?qū)⒃趪L試分析 Siddhartha 后停止運行——根本不分析 Moby Dick 和 Little Women

在前一個示例中,我們告訴用戶有一個文件找不到。但并非每次捕獲到異常時都需要告訴用戶,有時候你希望程序在發(fā)生異常時一聲不吭,就像什么都沒有發(fā)生一樣繼續(xù)運行。要讓程序在失敗時一聲不吭,可像通常那樣編寫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 語句?,F(xiàn)在,出現(xiàn)FileNotFoundError 異常時,將執(zhí)行except 代碼塊中的代碼,但什么都不會發(fā)生。這種錯誤發(fā)生時,不會出現(xiàn)traceback,也沒有任何輸出。用戶將看到存在的每個文件包含多少個單詞,但沒有任何跡象表明有一個文件未找到

pass 語句還充當(dāng)了占位符,它提醒你在程序的某個地方什么都沒有做,并且以后也許要在這里做些什么。例如,在這個程序中,我們可能決定將找不到的文件的名稱寫入到文件missing_files.txt中。用戶看不到這個文件,但我們可以讀取這個文件,進而處理所有文件找不到的問題

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • Python使用pdb調(diào)試代碼的技巧

    Python使用pdb調(diào)試代碼的技巧

    Pdb就是Python debugger,是python自帶的調(diào)試器。這篇文章主要介紹了Python使用pdb調(diào)試代碼的技巧,需要的朋友可以參考下
    2020-05-05
  • Python中的字符串相似度

    Python中的字符串相似度

    這篇文章主要介紹了Python中的字符串相似度,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • TensorFlow實現(xiàn)非線性支持向量機的實現(xiàn)方法

    TensorFlow實現(xiàn)非線性支持向量機的實現(xiàn)方法

    本篇文章主要介紹了TensorFlow實現(xiàn)非線性支持向量機的實現(xiàn)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • Python如何使用xlrd和xlwt庫讀寫excel文件

    Python如何使用xlrd和xlwt庫讀寫excel文件

    這篇文章主要介紹了Python如何使用xlrd和xlwt庫讀寫excel文件問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • 五個有趣的Python整蠱小程序合集

    五個有趣的Python整蠱小程序合集

    Python 能做很多無聊,但有意思的事情。本文為大家精心準(zhǔn)備了五個整蠱朋友的小程序,文中的示例代碼講解詳細(xì),感興趣的小伙伴快動手試一試
    2022-04-04
  • 通過示例學(xué)習(xí)python中os模塊的使用

    通過示例學(xué)習(xí)python中os模塊的使用

    os模塊是Python中處理文件和文件夾的重要模塊,其中了解模塊的一些基本功能對于使用Python對excel進行數(shù)據(jù)分析具有很大的幫助,這篇文章主要介紹了python os模塊使用,感興趣的朋友跟隨小編一起看看吧
    2022-12-12
  • Python2.x中str與unicode相關(guān)問題的解決方法

    Python2.x中str與unicode相關(guān)問題的解決方法

    這篇文章主要介紹了Python2.x中str與Unicode相關(guān)問題的解決方法,Python2.x版本中由于沒有默認(rèn)使用Unicode而會在實際使用中碰到一些字符問題,針對這些問題本文討論了一些解決方法,需要的朋友可以參考下
    2015-03-03
  • python實現(xiàn)人機對戰(zhàn)的五子棋游戲

    python實現(xiàn)人機對戰(zhàn)的五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了python實現(xiàn)人機對戰(zhàn)的五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • python中字符串的常見操作總結(jié)(一)

    python中字符串的常見操作總結(jié)(一)

    這篇文章主要介紹了python中字符串的常見操作總結(jié),文章通過簡單介紹對象的相關(guān)展開全文詳細(xì)內(nèi)容,需要的朋友可以參考一下
    2022-07-07
  • python實現(xiàn)while循環(huán)打印星星的四種形狀

    python實現(xiàn)while循環(huán)打印星星的四種形狀

    今天小編就為大家分享一篇python實現(xiàn)while循環(huán)打印星星的四種形狀,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11

最新評論

彰武县| 黔西| 天台县| 梅州市| 河东区| 汝阳县| 延长县| 平遥县| 延安市| 元朗区| 长春市| 安阳市| 平陆县| 黄大仙区| 聊城市| 奉新县| 沂南县| 昌平区| 富锦市| 邯郸市| 乌什县| 扎赉特旗| 特克斯县| 莱西市| 琼结县| 讷河市| 江油市| 岢岚县| 土默特左旗| 奉节县| 鹰潭市| 伊春市| 新绛县| 凤山县| 靖边县| 库尔勒市| 宜宾市| 长沙县| 兰坪| 皋兰县| 惠来县|