您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)Python中異常怎么處理,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
一、什么是異常處理
定義:異常處理就是我們?cè)趯慞ython時(shí),經(jīng)??吹降膱?bào)錯(cuò)信息,例如;NameError TypeError ValueError等,這些都是異常。
異常是一個(gè)事件,改事件會(huì)在程序執(zhí)行過程中發(fā)生,影響程序的正常執(zhí)行,一般情況下,在python中無法處理程序時(shí)就會(huì)發(fā)生異常,異常時(shí)Python的一個(gè)對(duì)象,表示一個(gè)錯(cuò)誤,當(dāng)Python腳本發(fā)生異常時(shí),我們需要捕獲并處理異常,否則程序就會(huì)終止執(zhí)行。
二、異常處理
當(dāng)Python腳本出現(xiàn)異常的時(shí)候我們?cè)趺刺幚砟牵?/p>
就如我們使用的工具出現(xiàn)了一點(diǎn)毛病,我們可以想辦法修理好它,程序也是一樣,之前的前輩們經(jīng)過不斷的積累與思考,創(chuàng)造了很多好得方法處理程序中出現(xiàn)的異常,本章我們就講一下使用try語句處理異常。
首先我們來說一下try語句的語法:
try語句與except 相結(jié)合使用,此語句用來檢測(cè)try語句塊中的錯(cuò)誤,從而讓except語句捕獲異常信息并處理,如果不想在發(fā)生異常時(shí)結(jié)束程序,只需要在try語句中捕獲異常即可
try: <代碼塊> except <異常名字> print(‘語句') 實(shí)例如下: def func(): try: a = x/y print('a=',a) return a eccept Exception: print('程序出現(xiàn)異常,異常信息:被除數(shù)為0')
三、拋出異常
在Python中使用raise語句拋出一個(gè)指定的異常,我們可以使用類或?qū)嵗齾?shù)調(diào)用raise語句引發(fā)異常。
實(shí)例如下:
class EvaException(BaseException): def __init__(self,msg): self.msg=msg def __str__(self): return self.msg try: raise EvaException('類型錯(cuò)誤') except EvaException as e: print(e)
四、捕捉多個(gè)異常
我們前面說了怎么處理一個(gè)異常的情況,如果涉及到多個(gè),我們?cè)撛趺刺幚砟牵?/p>
在Python中支持一個(gè)try/except語句處理多個(gè)異常,語法如下:
try: <語句> except <異常名字>: print(‘異常說明') except <異常名字>: print(‘異常說明') try語句的工作方式如下: 首次執(zhí)行try中語句塊,如果沒有發(fā)生異常,則忽略except中的字句,try語句中的代碼塊執(zhí)行后結(jié)束。如果try語句中的代碼塊出現(xiàn)異常,try中的剩余語句則會(huì)被忽略, 如果異常和eccept中的異常名字一直,相應(yīng)的except語句就會(huì)被執(zhí)行。如果一個(gè)異常也沒有匹配,這個(gè)異常就會(huì)傳遞給上層的try語句中,一個(gè)語句可能包含第一個(gè)except語句, 分別處理不同的異常,但是最多只有一個(gè)分支會(huì)執(zhí)行。 try: #a #1/0 dic = {1:2} dic[3] except NameError: print('名字沒有定義,報(bào)錯(cuò)了') except ZeroDivisionError: print('0不能當(dāng)做除數(shù),報(bào)錯(cuò)了') except KeyError: print('沒有這個(gè)key')
五、異常中else
我們?nèi)绻绦驁?zhí)行完異常后還想做其他的事情怎么辦?
這時(shí)我們就可以用到異常中的else了,具體語法如下:
try: <語句> except <異常名字> : <語句> except <異常名字>: <語句> else: <語句> #(try語句中沒有異常后執(zhí)行此段代碼) 如果在try語句中執(zhí)行沒有發(fā)生異常,就會(huì)執(zhí)行else語句,使用else語句比把所有語句都放在try字句里面更好,這樣可以避免一些意想不到的而except有沒有捕獲到的異常: def func(x,y): try: a = x/y except : print('Error,happened') else: print('It went as execpt') func(2,1)
六、用戶自定義異常
你可以通過創(chuàng)建一個(gè)新的exception類來擁有自己的異常。異常應(yīng)該繼承自 Exception 類,或者直接繼承,或者間接繼承,例如:
class MyError(Exception): def __init__(self, value): self.value = value def __str__(self): return repr(self.value) try: raise MyError(2*2) except MyError as e: print('My exception occurred, value:', e.value) My exception occurred, value: 4 raise MyError('oops!') Traceback (most recent call last): File "<stdin>", line 1, in ? main__.MyError: 'oops!' 在這個(gè)例子中,類 Exception 默認(rèn)的 __init__() 被覆蓋。 當(dāng)創(chuàng)建一個(gè)模塊有可能拋出多種不同的異常時(shí),一種通常的做法是為這個(gè)包建立一個(gè)基礎(chǔ)異常類,然后基于這個(gè)基礎(chǔ)類為不同的錯(cuò)誤情況創(chuàng)建不同的子類: class Error(Exception): """Base class for exceptions in this module.""" pass class InputError(Error): """Exception raised for errors in the input. Attributes: expression -- input expression in which the error occurred message -- explanation of the error """ def __init__(self, expression, message): self.expression = expression self.message = message class TransitionError(Error): """Raised when an operation attempts a state transition that's not allowed. Attributes: previous -- state at beginning of transition next -- attempted new state message -- explanation of why the specific transition is not allowed """ def __init__(self, previous, next, message): self.previous = previous self.next = next self.message = message 大多數(shù)的異常的名字都以"Error"結(jié)尾,就跟標(biāo)準(zhǔn)的異常命名一樣。
七、定義清理行為(finally語句)
try 語句還有另外一個(gè)可選的子句,它定義了無論在任何情況下都會(huì)執(zhí)行的清理行為。 例如:
>>> try: ... raise KeyboardInterrupt ... finally: ... print('Goodbye, world!') ... Goodbye, world! Traceback (most recent call last): File "<stdin>", line 2, in <module> KeyboardInterrupt 以上例子不管 try 子句里面有沒有發(fā)生異常,finally 子句都會(huì)執(zhí)行。 如果一個(gè)異常在 try 子句里(或者在 except 和 else 子句里)被拋出,而又沒有任何的 except 把它截住,那么這個(gè)異常會(huì)在 finally 子句執(zhí)行后再次被拋出。 下面是一個(gè)更加復(fù)雜的例子(在同一個(gè) try 語句里包含 except 和 finally 子句): >>> def divide(x, y): try: result = x / y except ZeroDivisionError: print("division by zero!") else: print("result is", result) finally: print("executing finally clause") >>> divide(2, 1) result is 2.0 executing finally clause >>> divide(2, 0) division by zero! executing finally clause >>> divide("2", "1") executing finally clause Traceback (most recent call last): File "<stdin>", line 1, in ? File "<stdin>", line 3, in divide TypeError: unsupported operand type(s) for /: 'str' and 'str' 預(yù)定義的清理行為 一些對(duì)象定義了標(biāo)準(zhǔn)的清理行為,無論系統(tǒng)是否成功的使用了它,一旦不需要它了,那么這個(gè)標(biāo)準(zhǔn)的清理行為就會(huì)執(zhí)行。 這面這個(gè)例子展示了嘗試打開一個(gè)文件,然后把內(nèi)容打印到屏幕上: for line in open("myfile.txt"): print(line, end="") 以上這段代碼的問題是,當(dāng)執(zhí)行完畢后,文件會(huì)保持打開狀態(tài),并沒有被關(guān)閉。 關(guān)鍵詞 with 語句就可以保證諸如文件之類的對(duì)象在使用完之后一定會(huì)正確的執(zhí)行他的清理方法: with open("myfile.txt") as f: for line in f: print(line, end="") 以上這段代碼執(zhí)行完畢后,就算在處理過程中出問題了,文件 f 總是會(huì)關(guān)閉。
python標(biāo)準(zhǔn)異常
異常名稱 | 描述 |
---|---|
BaseException | 所有異常的基類 |
SystemExit | 解釋器請(qǐng)求退出 |
KeyboardInterrupt | 用戶中斷執(zhí)行(通常是輸入^C) |
Exception | 常規(guī)錯(cuò)誤的基類 |
StopIteration | 迭代器沒有更多的值 |
GeneratorExit | 生成器(generator)發(fā)生異常來通知退出 |
StandardError | 所有的內(nèi)建標(biāo)準(zhǔn)異常的基類 |
ArithmeticError | 所有數(shù)值計(jì)算錯(cuò)誤的基類 |
FloatingPointError | 浮點(diǎn)計(jì)算錯(cuò)誤 |
OverflowError | 數(shù)值運(yùn)算超出最大限制 |
ZeroDivisionError | 除(或取模)零 (所有數(shù)據(jù)類型) |
AssertionError | 斷言語句失敗 |
AttributeError | 對(duì)象沒有這個(gè)屬性 |
EOFError | 沒有內(nèi)建輸入,到達(dá)EOF 標(biāo)記 |
EnvironmentError | 操作系統(tǒng)錯(cuò)誤的基類 |
IOError | 輸入/輸出操作失敗 |
OSError | 操作系統(tǒng)錯(cuò)誤 |
WindowsError | 系統(tǒng)調(diào)用失敗 |
ImportError | 導(dǎo)入模塊/對(duì)象失敗 |
LookupError | 無效數(shù)據(jù)查詢的基類 |
IndexError | 序列中沒有此索引(index) |
KeyError | 映射中沒有這個(gè)鍵 |
MemoryError | 內(nèi)存溢出錯(cuò)誤(對(duì)于Python 解釋器不是致命的) |
NameError | 未聲明/初始化對(duì)象 (沒有屬性) |
UnboundLocalError | 訪問未初始化的本地變量 |
ReferenceError | 弱引用(Weak reference)試圖訪問已經(jīng)垃圾回收了的對(duì)象 |
RuntimeError | 一般的運(yùn)行時(shí)錯(cuò)誤 |
NotImplementedError | 尚未實(shí)現(xiàn)的方法 |
SyntaxError | Python 語法錯(cuò)誤 |
IndentationError | 縮進(jìn)錯(cuò)誤 |
TabError | Tab 和空格混用 |
SystemError | 一般的解釋器系統(tǒng)錯(cuò)誤 |
TypeError | 對(duì)類型無效的操作 |
ValueError | 傳入無效的參數(shù) |
UnicodeError | Unicode 相關(guān)的錯(cuò)誤 |
UnicodeDecodeError | Unicode 解碼時(shí)的錯(cuò)誤 |
UnicodeEncodeError | Unicode 編碼時(shí)錯(cuò)誤 |
UnicodeTranslateError | Unicode 轉(zhuǎn)換時(shí)錯(cuò)誤 |
Warning | 警告的基類 |
DeprecationWarning | 關(guān)于被棄用的特征的警告 |
FutureWarning | 關(guān)于構(gòu)造將來語義會(huì)有改變的警告 |
OverflowWarning | 舊的關(guān)于自動(dòng)提升為長(zhǎng)整型(long)的警告 |
PendingDeprecationWarning | 關(guān)于特性將會(huì)被廢棄的警告 |
RuntimeWarning | 可疑的運(yùn)行時(shí)行為(runtime behavior)的警告 |
SyntaxWarning | 可疑的語法的警告 |
UserWarning | 用戶代碼生成的警告 |
關(guān)于“Python中異常怎么處理”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。