成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

使用Python進(jìn)行異常處理

sydMobile / 740人閱讀

摘要:為此,我們需要使用不同的異常處理程序定義多個(gè)子句。此異常由另一個(gè)異常子句處理,但除外。提高并重新提出異常中的關(guān)鍵字用于強(qiáng)制發(fā)生異常。如果沒有異常處理代碼,程序?qū)⒅淮蛴″e(cuò)誤消息并終止。因此,我們將使用子句,在記錄錯(cuò)誤后重新引發(fā)異常。

來源 | 愿碼(ChainDesk.CN)內(nèi)容編輯

愿碼Slogan | 連接每個(gè)程序員的故事

網(wǎng)站 | http://chaindesk.cn

愿碼愿景 | 打造全學(xué)科IT系統(tǒng)免費(fèi)課程,助力小白用戶、初級(jí)工程師0成本免費(fèi)系統(tǒng)學(xué)習(xí)、低成本進(jìn)階,幫助BAT一線資深工程師成長(zhǎng)并利用自身優(yōu)勢(shì)創(chuàng)造睡后收入。

官方公眾號(hào) | 愿碼 | 愿碼服務(wù)號(hào) | 區(qū)塊鏈部落

免費(fèi)加入愿碼全思維工程師社群 | 任一公眾號(hào)回復(fù)“愿碼”兩個(gè)字獲取入群二維碼


本文閱讀時(shí)長(zhǎng):10min

本文所涉及知識(shí)點(diǎn)

Python中有哪些異常 ?

使用try ... except子句控制程序流

通過處理異常來處理常見問題

創(chuàng)建和使用自定義異常類

在直接進(jìn)入代碼并解決這些問題之前,讓我們首先了解異常是什么以及處理異常是什么意思。

什么是異常?

異常是Python中的對(duì)象。它為我們提供了有關(guān)在程序執(zhí)行期間檢測(cè)到的錯(cuò)誤的信息。在調(diào)試應(yīng)用程序時(shí)注意到的錯(cuò)誤是未處理的異常,因?yàn)槲覀儧]有這些異常。在本文后面,您將學(xué)習(xí)處理這些異常的技巧。

在早期回溯中看到的ValueError和IndexError異常是Python中內(nèi)置異常類型的示例 。在下一節(jié)中,您將了解Python支持的其他一些內(nèi)置異常 。

最常見的異常

讓我們快速回顧一些最常遇到的異常。最簡(jiǎn)單的方法是嘗試運(yùn)行一些錯(cuò)誤的代碼,讓它報(bào)告錯(cuò)誤回溯的問題!啟動(dòng)Python解釋器并編寫以下代碼:

以下是一些異常情況:

正如您所看到的,代碼的每一行都會(huì)拋出一個(gè)帶有異常類型的錯(cuò)誤回溯(突出顯示)。這些是Python中的一些內(nèi)置異常。Python提供BaseException作為所有內(nèi)置異常的基類。但是,大多數(shù)內(nèi)置異常不直接繼承BaseException。相反,它們是從一個(gè)名為Exception的類派生而來的,而這個(gè)類又繼承自BaseException。處理程序退出的內(nèi)置異常(例如,SystemExit)直接從BaseException派生。您還可以創(chuàng)建自己的異常類作為Exception的子類。您將在本文后面了解到這一點(diǎn)。

異常處理

到目前為止,我們已經(jīng)看到了異常的發(fā)生方式 現(xiàn)在,是時(shí)候?qū)W習(xí)如何使用try ... except子句來處理這些異常。以下偽代碼顯示了try ... except子句的一個(gè)非常簡(jiǎn)單的示例:

我們來看看前面的代碼片段:

· 首先,程序嘗試執(zhí)行try子句中的代碼。

· 在執(zhí)行期間,如果出現(xiàn)錯(cuò)誤(如果發(fā)生異常),它將跳出此try子句。try塊中的其余代碼不會(huì)被執(zhí)行。

· 然后,它在except子句中查找適當(dāng)?shù)漠惓L幚沓绦虿?zhí)行它。

這里使用的 except子句是通用的。它將捕獲try子句中發(fā)生的所有類型的異常。而不是擁有這個(gè)“全能”處理程序,更好的做法是捕獲您預(yù)期的錯(cuò)誤并編寫特定于這些錯(cuò)誤的異常處理代碼。例如,try子句中的代碼可能會(huì)拋出AssertionError。您可以編寫特定的異常處理程序,而不是使用universal except子句,如下所示:

在這里,我們有一個(gè)except子句專門處理AssertionError。它還意味著除了AssertionError之外的任何錯(cuò)誤都將作為未處理的異常漏掉。為此,我們需要使用不同的異常處理程序定義多個(gè)except子句。但是,在任何時(shí)候,只會(huì)調(diào)用一個(gè)異常處理程序。用一個(gè)例子可以更好地解釋這一點(diǎn)。我們來看看下面的代碼片段:

該試塊調(diào)用solve_something() 。此函數(shù)接受一個(gè)數(shù)字作為用戶輸入,并斷言該數(shù)字大于零。如果斷言失敗,它會(huì)直接跳轉(zhuǎn)到處理程序,但AssertionError除外。

在另一個(gè)場(chǎng)景中,如果> 0,則執(zhí)行solve_something()中的其余代碼。您會(huì)注意到未定義變量x,這會(huì)導(dǎo)致NameError。此異常由另一個(gè)異常子句處理,但NameError除外。同樣,您可以為預(yù)期的錯(cuò)誤定義特定的異常處理程序。

提高并重新提出異常

Python中的raise關(guān)鍵字用于強(qiáng)制發(fā)生異常。換句話說,它引發(fā)了一個(gè)異常。語(yǔ)法很簡(jiǎn)單; 只需打開Python解釋器并輸入:

>>> raise AssertionError("some error message")

這會(huì)產(chǎn)生以下錯(cuò)誤回溯:

Traceback (most recent call last): 
  File "", line 1, in 
AssertionError :  some error message

在某些情況下,我們需要重新引發(fā)異常。假設(shè),在try子句中,您有一個(gè)將數(shù)字除以零的表達(dá)式。在普通算術(shù)中,這個(gè)表達(dá)沒有意義。這是一個(gè)錯(cuò)誤!這會(huì)導(dǎo)致程序引發(fā)一個(gè)名為ZeroDivisionError的異常。如果沒有異常處理代碼,程序?qū)⒅淮蛴″e(cuò)誤消息并終止。

如果您希望將此錯(cuò)誤寫入某個(gè)日志文件然后終止該程序,該怎么辦?在這里,您可以使用except子句首先記錄錯(cuò)誤。然后,使用不帶任何參數(shù)的raise關(guān)鍵字來重新引發(fā)異常。異常將在堆棧中向上傳播。在此示例中,它終止程序??梢允褂胷aise關(guān)鍵字重新引發(fā)異常而不使用任何參數(shù)。

這是一個(gè)示例,顯示如何重新引發(fā)異常:

可以看出,在解決a / b表達(dá)式時(shí),會(huì)出現(xiàn)zeroexception的adivision。這是因?yàn)樽兞縝的值設(shè)置為0。出于說明目的,我們假設(shè)此錯(cuò)誤沒有特定的異常處理程序。因此,我們將使用general except子句,在記錄錯(cuò)誤后重新引發(fā)異常。如果您想自己嘗試,只需在新的Python文件中編寫前面說明的代碼,然后從終端窗口運(yùn)行它。以下屏幕截圖顯示了上述代碼的輸出:

try ... except

可以在try ... except子句中指定可選的else塊。在其他的只發(fā)生ifno異常塊被執(zhí)行的嘗試......除了條款。語(yǔ)法如下:

在其他塊的前執(zhí)行最后條款,我們將在接下來的學(xué)習(xí)。

finally......clean it up!

還有其他東西可以添加到try ...除了... else story:一個(gè)可選的finally子句。顧名思義,此子句中的代碼在關(guān)聯(lián)的try ... except塊的末尾執(zhí)行。無論是否引發(fā)異常,finally子句(如果指定)將在try ... except子句的末尾執(zhí)行。想象一下它是由Python提供的全天候保證!以下代碼段顯示了finally塊的運(yùn)行情況:

運(yùn)行這個(gè)簡(jiǎn)單的代碼將產(chǎn)生以下輸出:

$ python finally_example1.py
Enter a number: -1
Uh oh..Assertion Error. 
Do some special cleanup 

輸出中的最后一行是finally子句中的print語(yǔ)句。

帶有和不帶finally子句的代碼片段如下面的屏幕截圖所示。即使except子句指示代碼從函數(shù)返回,也確保finally子句中的代碼最終執(zhí)行。

在最后條款通常用于離開功能之前執(zhí)行清理任務(wù)。示例用例是關(guān)閉數(shù)據(jù)庫(kù)連接或文件。但請(qǐng)注意,為此,您還可以在Python中使用with語(yǔ)句。

編寫一個(gè)新的異常類

創(chuàng)建一個(gè)從Exception派生的新異常類是微不足道的。打開Python解釋器并創(chuàng)建以下類:

>>> class GameUnitError(Exception):
...     pass
... 
>>>

就這樣!我們有一個(gè)新的異常類GameUnitError,可以部署了。如何測(cè)試此異常?在Python解釋器中鍵入以下代碼行:

>>> raise GameUnitError("ERROR: some problem with game unit")

引發(fā)新創(chuàng)建的異常將打印以下回溯:

>>> raise GameUnitError("ERROR: some problem with game unit")
Traceback (most recent call last):
  File "", line 1, in 
__main__.GameUnitError: ERROR: some problem with game unit

將GameUnitError類復(fù)制到其自己的模塊gameuniterror.py中,并將其保存在與attackoftheorcs_v1_1.py相同的目錄中。

接下來,更新attackoftheorcs_v1_1.py文件以包含以下更改:

首先,在文件的開頭添加以下import語(yǔ)句:

from gameuniterror import GameUnitError

第二個(gè)變化是在AbstractGameUnit.heal方法中。更新后的代碼顯示在以下代碼段中。觀察高亮代碼,只要提出的價(jià)值自定義異常self.health_meter超過的self.max_hp。

通過這兩個(gè)更改,運(yùn)行之前創(chuàng)建的heal_exception_example.py。您將看到引發(fā)新的異常,如以下屏幕截圖所示:

擴(kuò)展異常類

我們可以用GameUnitError類做更多的事情嗎?當(dāng)然!就像任何其他類一樣,我們可以定義屬性并使用它們。讓我們進(jìn)一步擴(kuò)展這個(gè)課程。在修改后的版本中,它將接受一個(gè)額外的參數(shù)和一些預(yù)定義的錯(cuò)誤代碼。更新的GameUnitError類顯示在以下屏幕截圖中:

我們來看看前面屏幕截圖中的代碼:

· 首先,它調(diào)用Exception超類的__init__方法,然后定義一些額外的實(shí)例變量。

· 一個(gè)新的dictionary對(duì)象self。error_dict將錯(cuò)誤整數(shù)代碼和錯(cuò)誤信息保存為鍵值對(duì)。

· 該self.error_message存儲(chǔ)有關(guān)根據(jù)提供的錯(cuò)誤代碼當(dāng)前錯(cuò)誤的信息。

· 在嘗試......除了子句確保error_dict實(shí)際上已經(jīng)由指定的鍵碼的說法。它不在except子句中,我們只是檢索默認(rèn)錯(cuò)誤代碼為000的值。

到目前為止,我們已經(jīng)對(duì)GameUnitError類和AbstractGameUnit.heal方法進(jìn)行了更改。我們還沒有完成。拼圖的最后一塊是修改主要在程序heal_exception_example.py文件。代碼顯示在以下屏幕截圖中:

我們來看看代碼:

· 由于heal_by值太大,try子句中的heal方法會(huì)引發(fā)GameUnitError異常。

· new except子句處理GameUnitError異常,就像任何其他內(nèi)置異常一樣。

· 在except子句中,我們有兩個(gè)print語(yǔ)句。第一個(gè)打印health_meter> max_hp?。ɑ叵胍幌?,當(dāng)在heal方法中引發(fā)此異常時(shí),此字符串被作為GameUnitError實(shí)例的第一個(gè)參數(shù)給出)。第二個(gè)print語(yǔ)句檢索并打印GameUnitError實(shí)例的error_message屬性。

我們已經(jīng)做好了所有的改變。我們可以在終端窗口中運(yùn)行此示例:

$ python heal_exception_example.py

該程序的輸出顯示在以下屏幕截圖中:

在這個(gè)簡(jiǎn)單的例子中,將錯(cuò)誤信息打印到控制臺(tái)。您可以進(jìn)一步將詳細(xì)錯(cuò)誤日志寫入文件,并跟蹤應(yīng)用程序運(yùn)行時(shí)生成的所有錯(cuò)誤消息。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/43767.html

相關(guān)文章

  • python錯(cuò)誤、異常和程序調(diào)試

    摘要:關(guān)鍵字拼寫錯(cuò)誤時(shí)會(huì)提示語(yǔ)法錯(cuò)誤,而變量名函數(shù)名拼寫錯(cuò)誤會(huì)在運(yùn)行時(shí)給出的錯(cuò)誤提示腳本程序不符合的語(yǔ)法規(guī)范例如如少了括號(hào),冒號(hào)等符號(hào),以及表達(dá)式書寫錯(cuò)誤等。異常的處理異常是程序在運(yùn)行過程中引發(fā)的錯(cuò)誤。 異常是Python程序在運(yùn)行過程中引發(fā)的錯(cuò)誤,如果程序中引發(fā)了未進(jìn)行處理的異常,程序就會(huì)由于異常而終止運(yùn)行,只有為程序添加異常處理,才能使程序更健壯。 Python對(duì)異常的處理,有它自己的語(yǔ)...

    Object 評(píng)論0 收藏0
  • 從JavaScript到Python異常

    摘要:但如果忽視異常輕則影響功能運(yùn)行,重則導(dǎo)致系統(tǒng)崩潰,造成經(jīng)濟(jì)損失。異常處理捕獲異常捕獲關(guān)鍵字與一致,都是使用。語(yǔ)句塊表示無論是否發(fā)生異常,語(yǔ)句塊代碼一定會(huì)被執(zhí)行。 不少前端工程師看到這個(gè)標(biāo)題可能會(huì)產(chǎn)生質(zhì)問: 我js用得好好的,能后端能APP,為什么還要學(xué)習(xí)Python? 至少有下面兩個(gè)理由: 學(xué)習(xí)曲線。ES6之后的JavaScript(TypeScript)的在語(yǔ)法上和Python有很...

    xcold 評(píng)論0 收藏0
  • 總結(jié):Python中的異常處理

    摘要:盡量使用內(nèi)置的異常處理語(yǔ)句來替換語(yǔ)句,比如語(yǔ)句,方法。以上是最簡(jiǎn)單的重新拋出異常的做法,也是推薦的做法。除了包含所有的外還包含了,和三個(gè)異常。避免在語(yǔ)句塊中干一些沒意義的事情,捕獲異常也是需要成本的。 異常處理在任何一門編程語(yǔ)言里都是值得關(guān)注的一個(gè)話題,良好的異常處理可以讓你的程序更加健壯,清晰的錯(cuò)誤信息更能幫助你快速修復(fù)問題。在Python中,和不部分高級(jí)語(yǔ)言一樣,使用了try/ex...

    douzifly 評(píng)論0 收藏0
  • python基礎(chǔ)教程:錯(cuò)誤處理異常處理

    摘要:在前面介紹語(yǔ)法的過程中,我們已經(jīng)接觸到了解釋器給的錯(cuò)誤和異常,但并沒有詳細(xì)講解它們。解釋器這樣報(bào)出的好處是告訴我們哪一行代碼出錯(cuò)了錯(cuò)誤的類型是什么。 在前面介紹Python語(yǔ)法的過程中,我們已經(jīng)接觸到了解釋器給的錯(cuò)誤和異常,但并沒有詳細(xì)講解它們?,F(xiàn)在我們就全面的來學(xué)習(xí)Python是對(duì)語(yǔ)法錯(cuò)誤等錯(cuò)誤進(jìn)行定義和處理的,這包括至少有兩種可以區(qū)分的錯(cuò)誤,它們是語(yǔ)法錯(cuò)誤和異常。 語(yǔ)法錯(cuò)誤 Pyt...

    tinylcy 評(píng)論0 收藏0
  • python---異常處理

    摘要:總結(jié)判斷式的異常處理只能針對(duì)某一段代碼,對(duì)于不同的代碼段的相同類型的錯(cuò)誤你需要寫重復(fù)的來進(jìn)行處理。提示是基于文件句柄而存在的,因而只能在拋出異常后才可以執(zhí)行異常類只能用來處理指定的異常情況,如果非指定異常則無法處理。 異常和錯(cuò)誤 程序中難免出現(xiàn)錯(cuò)誤,而錯(cuò)誤分成兩種 1.語(yǔ)法錯(cuò)誤(這種錯(cuò)誤,根本過不了python解釋器的語(yǔ)法檢測(cè),必須在程序執(zhí)行前就改正) #語(yǔ)法錯(cuò)誤示范一 if #語(yǔ)法...

    Alfred 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<