您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)怎么處理python中的異常,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
異常是什么
異常是可以修改程序控制流程的事件。
在 Python 中,異??梢员诲e(cuò)誤自動(dòng)觸發(fā),也可以由你的代碼手動(dòng)觸發(fā)。
我們將學(xué)習(xí)4種處理異常的語(yǔ)句,第一種有兩種形式,最后一種是 Python 2.6 和 Python 3.0 中的可選擴(kuò)展。
try/except:捕捉并恢復(fù) Python 自動(dòng)觸發(fā)的或自己代碼中的異常。
try/finally:無(wú)論異常是否發(fā)生,執(zhí)行清理操作。
raise:手動(dòng)觸發(fā)一個(gè)異常。
with/as:在 Python 2.6 ,3.0 或更新的版本中實(shí)現(xiàn)上下文管理器。
try/except 語(yǔ)句
try: statements # Run this main action first except name1: # Run if name1 is raised during try block statements except (name2, name3): # Run if any of these exceptions occur statements except name4 as var: # Run if name4 is raised, assign instance raised to var statements except: # Run for all other exceptions raised statements else: statements # Run if no exception was raised during try block
list_of_numbers = [number for number in range(1, 100)] print(list_of_numbers)
dictionary_of_numbers = {} for number in list_of_numbers: dictionary_of_numbers[number**2] = number try: index = list_of_numbers.index(2) value = dictionary_of_numbers[index] except (ValueError, KeyError): print('Error Raised, but Controlled! ') else: # This executes ONLY if no exception is raised print('Getting number at position %d : %d' % (index, value)) finally: # Do cleanup operations print('Cleaning UP')
try/finally 語(yǔ)句
try/finally 是 try 語(yǔ)句的一種形式,finally 語(yǔ)句是 try 之后無(wú)論是否出現(xiàn)異常都要執(zhí)行的語(yǔ)句。
try: statements # Run this action first finally: statements # Always run this code on the way out
with/as 上下文管理器
Python 2.6 和 3.0 引入了一個(gè)新的異常相關(guān)的語(yǔ)句-with 和可選的 as 子句。with語(yǔ)句允許開(kāi)發(fā)者創(chuàng)建上下文管理器,上下文管理器就是允許你可以自動(dòng)地開(kāi)始和結(jié)束一些事情。例如,你可能想要打開(kāi)一個(gè)文件,然后寫(xiě)入一些內(nèi)容,最后再關(guān)閉文件。這就是上下文管理器中一個(gè)最經(jīng)典的示例。事實(shí)上,當(dāng)你利用with語(yǔ)句打開(kāi)一個(gè)文件時(shí),Python替你自動(dòng)創(chuàng)建了一個(gè)上下文管理器。
上下文管理器簡(jiǎn)介
基本用法
with expression [as variable]: with-block
經(jīng)典用法
with open(r'C:\misc\data') as myfile: for line in myfile: print(line) # ...more code here...
使用多個(gè)上下文管理器
with open('script1.py') as f1, open('script2.py') as f2: for (linenum, (line1, line2)) in enumerate(zip(f1, f2)): if line1 != line2: print('%s\n%r\n%r' % (linenum, line1, line2))
工作原理
上下文管理器必須包含 __enter__ 和 __exit__ 方法。
__enter__ 方法被自動(dòng)調(diào)用,如果存在 as 子句,返回值就被賦值給 as 后的變量,沒(méi)有就直接丟棄。
嵌套在 with 語(yǔ)句下的代碼被執(zhí)行。
如果 with 語(yǔ)句中的代碼拋出異常, __exit__(type, value, traceback) 方法就會(huì)被調(diào)用。參數(shù)值是和 sys.exc_info() (Python 內(nèi)置函數(shù))函數(shù)返回值相同的值。如果這個(gè)方法返回了一個(gè) false 值,異常就會(huì)被重新拋出,否則異常終止。異常重新拋出是以常規(guī)方式拋出的,因此在 with 語(yǔ)句外捕獲。
如果 with 語(yǔ)句里的代碼塊沒(méi)有拋出異常,__exit__ 方法仍舊會(huì)被調(diào)用,但是參數(shù)會(huì)被置為 None。
異常用法
class TraceBlock: def message(self, arg): print('running ' + arg) def __enter__(self): print('starting with block') return self def __exit__(self, exc_type, exc_value, exc_tb): if exc_type is None: print('exited normally\n') else: print('raise an exception! ' + str(exc_type)) return False # Propagate
with TraceBlock() as action: action.message('test 1') print('reached')
with TraceBlock() as action: action.message('test 2') raise TypeError() print('not reached')
用戶(hù)自定義異常
class AlreadyGotOne(Exception): pass def gail(): raise AlreadyGotOne()
try: gail() except AlreadyGotOne: print('got exception')
class Career(Exception): def __init__(self, job, *args, **kwargs): super(Career, self).__init__(*args, **kwargs) self._job = job def __str__(self): return 'So I became a waiter of {}'.format(self._job) raise Career('Engineer')
看完上述內(nèi)容,你們對(duì)怎么處理python中的異常有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。
免責(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)容。