摘要:為此,我們需要使用不同的異常處理程序定義多個子句。此異常由另一個異常子句處理,但除外。提高并重新提出異常中的關(guān)鍵字用于強制發(fā)生異常。如果沒有異常處理代碼,程序?qū)⒅淮蛴″e誤消息并終止。因此,我們將使用子句,在記錄錯誤后重新引發(fā)異常。
來源 | 愿碼(ChainDesk.CN)內(nèi)容編輯
愿碼Slogan | 連接每個程序員的故事
網(wǎng)站 | http://chaindesk.cn
愿碼愿景 | 打造全學(xué)科IT系統(tǒng)免費課程,助力小白用戶、初級工程師0成本免費系統(tǒng)學(xué)習(xí)、低成本進階,幫助BAT一線資深工程師成長并利用自身優(yōu)勢創(chuàng)造睡后收入。
官方公眾號 | 愿碼 | 愿碼服務(wù)號 | 區(qū)塊鏈部落
免費加入愿碼全思維工程師社群 | 任一公眾號回復(fù)“愿碼”兩個字獲取入群二維碼
本文閱讀時長:10min
本文所涉及知識點
Python中有哪些異常 ?
使用try ... except子句控制程序流
通過處理異常來處理常見問題
創(chuàng)建和使用自定義異常類
在直接進入代碼并解決這些問題之前,讓我們首先了解異常是什么以及處理異常是什么意思。
什么是異常?異常是Python中的對象。它為我們提供了有關(guān)在程序執(zhí)行期間檢測到的錯誤的信息。在調(diào)試應(yīng)用程序時注意到的錯誤是未處理的異常,因為我們沒有這些異常。在本文后面,您將學(xué)習(xí)處理這些異常的技巧。
在早期回溯中看到的ValueError和IndexError異常是Python中內(nèi)置異常類型的示例 。在下一節(jié)中,您將了解Python支持的其他一些內(nèi)置異常 。
最常見的異常讓我們快速回顧一些最常遇到的異常。最簡單的方法是嘗試運行一些錯誤的代碼,讓它報告錯誤回溯的問題!啟動Python解釋器并編寫以下代碼:
以下是一些異常情況:
正如您所看到的,代碼的每一行都會拋出一個帶有異常類型的錯誤回溯(突出顯示)。這些是Python中的一些內(nèi)置異常。Python提供BaseException作為所有內(nèi)置異常的基類。但是,大多數(shù)內(nèi)置異常不直接繼承BaseException。相反,它們是從一個名為Exception的類派生而來的,而這個類又繼承自BaseException。處理程序退出的內(nèi)置異常(例如,SystemExit)直接從BaseException派生。您還可以創(chuàng)建自己的異常類作為Exception的子類。您將在本文后面了解到這一點。
異常處理到目前為止,我們已經(jīng)看到了異常的發(fā)生方式 現(xiàn)在,是時候?qū)W習(xí)如何使用try ... except子句來處理這些異常。以下偽代碼顯示了try ... except子句的一個非常簡單的示例:
我們來看看前面的代碼片段:
· 首先,程序嘗試執(zhí)行try子句中的代碼。
· 在執(zhí)行期間,如果出現(xiàn)錯誤(如果發(fā)生異常),它將跳出此try子句。try塊中的其余代碼不會被執(zhí)行。
· 然后,它在except子句中查找適當?shù)漠惓L幚沓绦虿?zhí)行它。
這里使用的 except子句是通用的。它將捕獲try子句中發(fā)生的所有類型的異常。而不是擁有這個“全能”處理程序,更好的做法是捕獲您預(yù)期的錯誤并編寫特定于這些錯誤的異常處理代碼。例如,try子句中的代碼可能會拋出AssertionError。您可以編寫特定的異常處理程序,而不是使用universal except子句,如下所示:
在這里,我們有一個except子句專門處理AssertionError。它還意味著除了AssertionError之外的任何錯誤都將作為未處理的異常漏掉。為此,我們需要使用不同的異常處理程序定義多個except子句。但是,在任何時候,只會調(diào)用一個異常處理程序。用一個例子可以更好地解釋這一點。我們來看看下面的代碼片段:
該試塊調(diào)用solve_something() 。此函數(shù)接受一個數(shù)字作為用戶輸入,并斷言該數(shù)字大于零。如果斷言失敗,它會直接跳轉(zhuǎn)到處理程序,但AssertionError除外。
在另一個場景中,如果> 0,則執(zhí)行solve_something()中的其余代碼。您會注意到未定義變量x,這會導(dǎo)致NameError。此異常由另一個異常子句處理,但NameError除外。同樣,您可以為預(yù)期的錯誤定義特定的異常處理程序。
提高并重新提出異常Python中的raise關(guān)鍵字用于強制發(fā)生異常。換句話說,它引發(fā)了一個異常。語法很簡單; 只需打開Python解釋器并輸入:
>>> raise AssertionError("some error message")
這會產(chǎn)生以下錯誤回溯:
Traceback (most recent call last): File "", line 1, in AssertionError : some error message
在某些情況下,我們需要重新引發(fā)異常。假設(shè),在try子句中,您有一個將數(shù)字除以零的表達式。在普通算術(shù)中,這個表達沒有意義。這是一個錯誤!這會導(dǎo)致程序引發(fā)一個名為ZeroDivisionError的異常。如果沒有異常處理代碼,程序?qū)⒅淮蛴″e誤消息并終止。
如果您希望將此錯誤寫入某個日志文件然后終止該程序,該怎么辦?在這里,您可以使用except子句首先記錄錯誤。然后,使用不帶任何參數(shù)的raise關(guān)鍵字來重新引發(fā)異常。異常將在堆棧中向上傳播。在此示例中,它終止程序。可以使用raise關(guān)鍵字重新引發(fā)異常而不使用任何參數(shù)。
這是一個示例,顯示如何重新引發(fā)異常:
可以看出,在解決a / b表達式時,會出現(xiàn)zeroexception的adivision。這是因為變量b的值設(shè)置為0。出于說明目的,我們假設(shè)此錯誤沒有特定的異常處理程序。因此,我們將使用general except子句,在記錄錯誤后重新引發(fā)異常。如果您想自己嘗試,只需在新的Python文件中編寫前面說明的代碼,然后從終端窗口運行它。以下屏幕截圖顯示了上述代碼的輸出:
try ... except可以在try ... except子句中指定可選的else塊。在其他的只發(fā)生ifno異常塊被執(zhí)行的嘗試......除了條款。語法如下:
在其他塊的前執(zhí)行最后條款,我們將在接下來的學(xué)習(xí)。
finally......clean it up!還有其他東西可以添加到try ...除了... else story:一個可選的finally子句。顧名思義,此子句中的代碼在關(guān)聯(lián)的try ... except塊的末尾執(zhí)行。無論是否引發(fā)異常,finally子句(如果指定)將在try ... except子句的末尾執(zhí)行。想象一下它是由Python提供的全天候保證!以下代碼段顯示了finally塊的運行情況:
運行這個簡單的代碼將產(chǎn)生以下輸出:
$ python finally_example1.py Enter a number: -1 Uh oh..Assertion Error. Do some special cleanup
輸出中的最后一行是finally子句中的print語句。
帶有和不帶finally子句的代碼片段如下面的屏幕截圖所示。即使except子句指示代碼從函數(shù)返回,也確保finally子句中的代碼最終執(zhí)行。
在最后條款通常用于離開功能之前執(zhí)行清理任務(wù)。示例用例是關(guān)閉數(shù)據(jù)庫連接或文件。但請注意,為此,您還可以在Python中使用with語句。
編寫一個新的異常類創(chuàng)建一個從Exception派生的新異常類是微不足道的。打開Python解釋器并創(chuàng)建以下類:
>>> class GameUnitError(Exception): ... pass ... >>>
就這樣!我們有一個新的異常類GameUnitError,可以部署了。如何測試此異常?在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語句:
from gameuniterror import GameUnitError
第二個變化是在AbstractGameUnit.heal方法中。更新后的代碼顯示在以下代碼段中。觀察高亮代碼,只要提出的價值自定義異常self.health_meter超過的self.max_hp。
通過這兩個更改,運行之前創(chuàng)建的heal_exception_example.py。您將看到引發(fā)新的異常,如以下屏幕截圖所示:
擴展異常類我們可以用GameUnitError類做更多的事情嗎?當然!就像任何其他類一樣,我們可以定義屬性并使用它們。讓我們進一步擴展這個課程。在修改后的版本中,它將接受一個額外的參數(shù)和一些預(yù)定義的錯誤代碼。更新的GameUnitError類顯示在以下屏幕截圖中:
我們來看看前面屏幕截圖中的代碼:
· 首先,它調(diào)用Exception超類的__init__方法,然后定義一些額外的實例變量。
· 一個新的dictionary對象self。error_dict將錯誤整數(shù)代碼和錯誤信息保存為鍵值對。
· 該self.error_message存儲有關(guān)根據(jù)提供的錯誤代碼當前錯誤的信息。
· 在嘗試......除了子句確保error_dict實際上已經(jīng)由指定的鍵碼的說法。它不在except子句中,我們只是檢索默認錯誤代碼為000的值。
到目前為止,我們已經(jīng)對GameUnitError類和AbstractGameUnit.heal方法進行了更改。我們還沒有完成。拼圖的最后一塊是修改主要在程序heal_exception_example.py文件。代碼顯示在以下屏幕截圖中:
我們來看看代碼:
· 由于heal_by值太大,try子句中的heal方法會引發(fā)GameUnitError異常。
· new except子句處理GameUnitError異常,就像任何其他內(nèi)置異常一樣。
· 在except子句中,我們有兩個print語句。第一個打印health_meter> max_hp!(回想一下,當在heal方法中引發(fā)此異常時,此字符串被作為GameUnitError實例的第一個參數(shù)給出)。第二個print語句檢索并打印GameUnitError實例的error_message屬性。
我們已經(jīng)做好了所有的改變。我們可以在終端窗口中運行此示例:
$ python heal_exception_example.py
該程序的輸出顯示在以下屏幕截圖中:
在這個簡單的例子中,將錯誤信息打印到控制臺。您可以進一步將詳細錯誤日志寫入文件,并跟蹤應(yīng)用程序運行時生成的所有錯誤消息。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/43767.html
摘要:關(guān)鍵字拼寫錯誤時會提示語法錯誤,而變量名函數(shù)名拼寫錯誤會在運行時給出的錯誤提示腳本程序不符合的語法規(guī)范例如如少了括號,冒號等符號,以及表達式書寫錯誤等。異常的處理異常是程序在運行過程中引發(fā)的錯誤。 異常是Python程序在運行過程中引發(fā)的錯誤,如果程序中引發(fā)了未進行處理的異常,程序就會由于異常而終止運行,只有為程序添加異常處理,才能使程序更健壯。 Python對異常的處理,有它自己的語...
摘要:但如果忽視異常輕則影響功能運行,重則導(dǎo)致系統(tǒng)崩潰,造成經(jīng)濟損失。異常處理捕獲異常捕獲關(guān)鍵字與一致,都是使用。語句塊表示無論是否發(fā)生異常,語句塊代碼一定會被執(zhí)行。 不少前端工程師看到這個標題可能會產(chǎn)生質(zhì)問: 我js用得好好的,能后端能APP,為什么還要學(xué)習(xí)Python? 至少有下面兩個理由: 學(xué)習(xí)曲線。ES6之后的JavaScript(TypeScript)的在語法上和Python有很...
摘要:盡量使用內(nèi)置的異常處理語句來替換語句,比如語句,方法。以上是最簡單的重新拋出異常的做法,也是推薦的做法。除了包含所有的外還包含了,和三個異常。避免在語句塊中干一些沒意義的事情,捕獲異常也是需要成本的。 異常處理在任何一門編程語言里都是值得關(guān)注的一個話題,良好的異常處理可以讓你的程序更加健壯,清晰的錯誤信息更能幫助你快速修復(fù)問題。在Python中,和不部分高級語言一樣,使用了try/ex...
摘要:在前面介紹語法的過程中,我們已經(jīng)接觸到了解釋器給的錯誤和異常,但并沒有詳細講解它們。解釋器這樣報出的好處是告訴我們哪一行代碼出錯了錯誤的類型是什么。 在前面介紹Python語法的過程中,我們已經(jīng)接觸到了解釋器給的錯誤和異常,但并沒有詳細講解它們。現(xiàn)在我們就全面的來學(xué)習(xí)Python是對語法錯誤等錯誤進行定義和處理的,這包括至少有兩種可以區(qū)分的錯誤,它們是語法錯誤和異常。 語法錯誤 Pyt...
摘要:總結(jié)判斷式的異常處理只能針對某一段代碼,對于不同的代碼段的相同類型的錯誤你需要寫重復(fù)的來進行處理。提示是基于文件句柄而存在的,因而只能在拋出異常后才可以執(zhí)行異常類只能用來處理指定的異常情況,如果非指定異常則無法處理。 異常和錯誤 程序中難免出現(xiàn)錯誤,而錯誤分成兩種 1.語法錯誤(這種錯誤,根本過不了python解釋器的語法檢測,必須在程序執(zhí)行前就改正) #語法錯誤示范一 if #語法...
閱讀 1751·2021-09-23 11:34
閱讀 2472·2021-09-22 15:45
閱讀 12820·2021-09-22 15:07
閱讀 2221·2021-09-02 15:40
閱讀 4107·2021-07-29 14:48
閱讀 1071·2019-08-30 15:55
閱讀 3245·2019-08-30 15:55
閱讀 2190·2019-08-30 15:55