Python中的用戶定義異常與NZEC錯誤
前提條件-?本文是對異常處理的擴(kuò)展。
當(dāng)代碼出錯時,Python會引發(fā)錯誤和異常,這可能導(dǎo)致程序突然停止。Python還通過try-except提供了異常處理方法。一些最常見的標(biāo)準(zhǔn)異常包括IndexError,ImportError,IOError,ZeroDivisionError,TypeError和FileNotFoundError。用戶可以使用異常類創(chuàng)建自己的錯誤。
創(chuàng)建用戶定義的異常
程序員可以通過創(chuàng)建新的異常類來命名自己的異常。需要直接或間接從Exception類派生異常。盡管不是強(qiáng)制性的,但大多數(shù)異常的名稱都以“錯誤”結(jié)尾,類似于python中標(biāo)準(zhǔn)異常的命名。例如:
# 創(chuàng)建用戶定義異常的python程序# 類MyError是從超類異常派生的class MyError(Exception):# 構(gòu)造函數(shù)或初始值設(shè)定項def __init__(self, value):self.value = value# __str_uu是print()值def __str__(self):return(repr(self.value))try:raise(MyError(3*2))#?異常值存儲錯誤except MyError as error:print('發(fā)生了新的異常: ',error.value)
輸出:
('發(fā)生了新的異常: 6')完全了解異常類
要了解有關(guān)類異常的更多信息,請看以下代碼
help(Exception)?從超類異常派生錯誤
當(dāng)模塊需要處理幾個不同的錯誤時,將創(chuàng)建超類異常。常用的方法之一是為該模塊定義的異常創(chuàng)建基類。此外,定義了各種子類來為不同的錯誤條件創(chuàng)建特定的異常類。
# 類錯誤是從超級類異常派生的class Error(Exception):# Error是異常的派生類,但是#此模塊中異常的基類passclass TransitionError(Error):# 操作嘗試狀態(tài)時引發(fā)#不允許的過渡。def __init__(self, prev, nex, msg):self.prev = prevself.next = nex# 拋出的錯誤消息保存在消息中self.msg = msgtry:raise(TransitionError(2,3*2,"Not Allowed"))# 異常值存儲錯誤except TransitionError as error:print('Exception occured: ',error.msg)
輸出:
('Exception occured: ', 'Not Allowed')如何使用標(biāo)準(zhǔn)異常作為基類?
運(yùn)行時錯誤是一個類,是一種標(biāo)準(zhǔn)異常,當(dāng)生成的錯誤不屬于任何類別時會引發(fā)此錯誤。該程序說明了如何將運(yùn)行時錯誤用作基礎(chǔ)類,將網(wǎng)絡(luò)錯誤用作派生類。以類似的方式,任何異常都可以從Python的標(biāo)準(zhǔn)異常派生而來。
# NetworkError具有基本RuntimeError# 也不例外class Networkerror(RuntimeError):def __init__(self, arg):self.args = argtry:raise Networkerror("Error")except Networkerror as e:print (e.args)
輸出:
(“?E”,“?r”,“?r”,“?o”,“?r”)在各種競爭性網(wǎng)站上進(jìn)行編碼時,許多人一定遇到NZEC錯誤。顧名思義,NZEC(非零退出代碼)發(fā)生在您的代碼未能返回0時。當(dāng)代碼返回0時,表示它已成功執(zhí)行,否則將根據(jù)錯誤類型返回其他一些數(shù)字。
當(dāng)程序結(jié)束并且應(yīng)該返回“ 0”以指示是否完成正常并且無法執(zhí)行時,會導(dǎo)致NZEC。當(dāng)然,還有更多與NZEC相關(guān)的案例。
為何發(fā)生NZEC?(一個例子)
在python中,通常多個輸入之間用逗號分隔,我們使用input()或int(input())進(jìn)行讀取,但是大多數(shù)在線編碼平臺在測試時都會以空格分隔輸入,在這種情況下,輸入為int(input())無法正確讀取輸入并顯示NZEC之類的錯誤。
怎么解決?
例如,考慮一個簡單的程序,您必須讀取2個整數(shù)并將其打?。ㄔ谳斎胛募校瑑蓚€整數(shù)都在同一行中)。假設(shè)您有兩個整數(shù),如下所示:
23 45
而不使用:
n = int(輸入())k = int(輸入())
用:
n,k?=?raw_input().split('')n =整數(shù)(n)k =整數(shù)(k)
用空格分隔輸入。
錯誤代碼
n = int(input())k = int(input())print n," ",k
輸入:
2 3
當(dāng)您使用上面的輸入在IDE中運(yùn)行以上代碼時,您將得到錯誤:
追溯(最近一次通話):b712edd81d4a972de2a9189fac8a83ed.py”n = int(輸入())文件“”,第1行2 3^SyntaxError:解析時出現(xiàn)意外的EOF
當(dāng)輸入在2條不同的2行中時,上面的代碼可以正常工作。您可以測試自己。要克服此問題,您需要使用split。
正確的代碼
n, k = raw_input().split(" ")n = int(n)k = int(k)print n," ",k
輸入:
7?3輸出:
7?3NZEC錯誤的一些突出原因
無限遞歸或堆棧內(nèi)存不足。
輸入和輸出都與測試用例不完全相同。
作為在線平臺,使用與您的輸出與指定輸出完全匹配的計算機(jī)代碼測試程序。
當(dāng)您的程序執(zhí)行基本的編程錯誤(例如除以0)時,也會顯示此類錯誤。
檢查變量的值,它們很容易受到整數(shù)流的影響。
????
