本篇文章將介紹什麼是異常,初學者遇見異常時發生的情況,如何捕獲和處理異常,以及自定義異常;
通常的錯誤是指語法錯誤,即在編碼後進行編譯的時候就會發生的錯誤,一般高階的編譯器都能自動識別語法錯誤;比較重要的就是異常,異常是指在程式執行期間發生的錯誤,比如報空異常,算術異常等待;通常我們可以使用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 函式 注意,當庫函式執...