pyhton專題異常與錯誤

2021-10-02 18:26:48 字數 3783 閱讀 3667

本篇文章將介紹什麼是異常,初學者遇見異常時發生的情況,如何捕獲和處理異常,以及自定義異常;

通常的錯誤是指語法錯誤,即在編碼後進行編譯的時候就會發生的錯誤,一般高階的編譯器都能自動識別語法錯誤;比較重要的就是異常,異常是指在程式執行期間發生的錯誤,比如報空異常,算術異常等待;通常我們可以使用raise丟擲乙個異常或者使用assert斷言乙個異常;

# -*- coding: utf-8 -*-

result = 5/0

當執行以上程式的時候就會出現異常(常數不能除0);出現錯誤資訊如下,此時會造成程式停止,這是在開發中一種非常不友好的現象;我們需要的是列印出異常資訊(通常是日誌的方式),然後程式繼續執行,並且不影響其它模組的程式執行;

traceback (most recent call last):

file "c:/python_work/study_py_base/base/expre.py", line 3, in result = 5/0

zerodivisionerror: division by zero

通常最簡單的異常就是try/except模式進行處理,具體的說明如下

try **塊中存放的內容是有可能會發生異常的**

except **塊存放的內容是對發生異常時進行處理的動作,通常就是不做任務處理或者列印異常資訊;

# -*- coding: utf-8 -*-

try:

result = 5/0

except zerodivisionerror:

print("the error occur ")

print("zszxz")

以上**執行後不會像3.1節中的程式立即停止,而是會繼續執行後面的**,列印內容如下,由此我們就解決了捕獲異常,列印自定義異常資訊;

the error occur 

zszxz

現在異常列印的內容是自定義,如果知識追尋者想要列印原來的異常資訊就需要對zerodivisionerror 物件進行進一步的屬性或者方法呼叫

# -*- coding: utf-8 -*-

try:

result = 5/0

except zerodivisionerror as e:

print(e)

print("zszxz")

以上的**執行後就會列印出原有的異常資訊

division by zero

zszxz

try **塊中存放的內容是有可能會發生異常的**

except **塊存放的內容是對發生異常時進行處理的動作

else是存放不會發生異常的**,有個坑是如果try中的**發生異常了,else中的**是不會執行的;

try**塊中沒有發生異常的情況

# -*- coding: utf-8 -*-

try:

result = 5/6

except zerodivisionerror as e:

print("the error is {}".format(e))

else:

print(" normal code ")

執行結果

normal code
try**塊中發生異常的情況

# -*- coding: utf-8 -*-

try:

result = 5/0

except zerodivisionerror as e:

print("the error is {}".format(e))

else:

print(" normal code ")

執行結果

the error is division by zero
try **塊中存放的內容是有可能會發生異常的**

except **塊存放的內容是對發生異常時進行處理的動作

else是存放不會發生異常的**,有個坑是如果try中的**發生異常了,else中的**是不會執行的

finally中存放的**無論是否發生異常都會執行,通常我們用來關閉資源控制代碼;

# -*- coding: utf-8 -*-

try:

result = 5/0

except zerodivisionerror as e:

print("the error is {}".format(e))

else:

print(" normal code ")

finally:

print(" it must be excuted")

輸出結果

the error is division by zero

it must be excuted

有時候在編碼過程中,出現了一些不是我們想要的結果的時候就可以丟擲異常;比如我們想要獲得乙個引數是int型別,結果接受到的是字串型別,這時候你就可以丟擲乙個異常告訴那個傳字串型別引數的傢伙,這不是我要的型別的資料;

怎麼丟擲異常呢,很簡單使用raise關鍵字,後面跟上異常物件即可,示例如下

# -*- coding: utf-8 -*-

param = "收下我的心意吧"

if type(param)==int:

print("這是我要的型別")

else:

raise nameerror('這不是我要的型別')

此時就出現異常資訊如下

traceback (most recent call last):

file "c:/python_work/study_py_base/base/expre.py", line 8, in raise nameerror('這不是我要的型別')

nameerror: 這不是我要的型別

在第四節丟擲異常的時候是不是感覺有點怪怪的呢,nameerror 這個異常是系統自帶的異常,我們是直接拿過來用了,可是跟異常資訊一點都不符合對吧,應該是typeerror才對,這樣異常物件就能和異常資訊匹對上了;因此為了讓異常顯示的更加規範和友好就需要使用者自定義異常,而不是使用系統那些預設的異常(如果異常資訊匹配就使用系統自帶的即可)

如下示例中自定義異常類需要繼承exception,然後覆蓋重寫__init__方法即可,此時丟擲的異常就比較規範了;

# -*- coding: utf-8 -*-

param = "收下我的心意吧"

if type(param)==int:

print("這是我要的型別")

else:

raise typeerror('這不是我要的型別')

"""自定義異常"""

class typeerror(exception):

def __init__(self, value):

self.value = value

執行結果

traceback (most recent call last):

file "c:/python_work/study_py_base/base/expre.py", line 8, in raise typeerror('這不是我要的型別')

typeerror: 這不是我要的型別

錯誤與異常

錯誤 語法錯誤也稱編譯錯誤,拼寫錯誤等導致編譯器無法將源 轉換為位元組碼 邏輯錯誤是程式可以執行 本身不報錯 但執行結果不正確,需要根據結果來除錯判斷 異常沒有語法錯誤的前提下,在執行期間產生特定的錯誤 每個特定錯誤都對應到乙個異常類物件,當發生某個特定錯誤時,其對應的異常類物件的例項物件會被輸出 ...

錯誤與異常

追蹤資訊 異常型別 異常值 traceback valueerror 異常值 常用異常 attributeerror 試圖訪問乙個物件沒有的樹形,比如foo.x,但是foo沒有屬性x ioerror 輸入 輸出異常 基本上是無法開啟檔案 importerror 無法引入模組或包 基本上是路徑問題或名...

錯誤 與 異常

1.perror 函式 void perror const char message 當某個庫函式出錯時,該庫函式首先會將代表出錯的具體原因出錯 儲存到全域性變數 errno 而 perror 只是將errno 代表的錯誤報告給使用者 實際上是呼叫strerrno errno 函式 注意,當庫函式執...