上一節(jié)我們已經(jīng)了解了異常情況的發(fā)生,這一節(jié)我們來學(xué)習(xí)一下異常處理語句,先舉個例子,假定甲乙丙丁4輛車分別能承載1噸、2噸、3噸、4噸的貨物,當(dāng)公司接來了任務(wù)(貨物不可拆分),會首先去考慮甲車能否承載,如果不能承載就交由乙車去裝運(yùn),如果不能就繼續(xù)選擇車輛,如果最后都沒辦法處理該貨物,那么就終止該程序,我們可以把這個貨物看作異常來理解。
處理異常的語句有多種形式,分別為try...except語句、多except代碼塊、try...except...else語句和try...except...finally語句、try...excpept...else語句。
1. try...except語句
這種形式為我們常用的形式,它的語法格式為:
try: block Except [typeerror ]: deal
block為我們的程序執(zhí)行過程中可能會拋出異常的語句,typeerror為錯誤類型,如果省略就不指定類型,即捕獲全部異常,deal為具體的處理語句。
我們通過例子來了解一下這個語句,代碼如下:
def test(): number = int(input('請輸入一個數(shù)字:')) if 15 / number >= 3: print('ok') else: print('wrong') try: test() except: print('分母為0的異常情況')
我們通過幾個輸入情況來測試結(jié)果:
請輸入一個數(shù)字: 5 ok 請輸入一個數(shù)字:2 ok 請輸入一個數(shù)字:dotcpp 分母為0的異常情況 請輸入一個數(shù)字:0 分母為0的異常情況
我們可以發(fā)現(xiàn)我們在except語句中沒有指定類型,所以它捕獲了所有異常并執(zhí)行相關(guān)語句,因此我們輸入了dotcpp也觸發(fā)了這種異常,因此我們需要對代碼進(jìn)行修改,我們需要把except語句更改為:except ZeroDivisionError,然后我們再次執(zhí)行,輸出結(jié)果為:
請輸入一個數(shù)字:dotcpp Traceback (most recent call last): File "C:/Users/輕煙/PycharmProjects/untitled1/teach/test.py", line 8, in <module> test() File "C:/Users/輕煙/PycharmProjects/untitled1/teach/test.py", line 2, in test number = int(input('請輸入一個數(shù)字:')) ValueError: invalid literal for int() with base 10: 'dotcpp'
輸入0的時候:
請輸入一個數(shù)字:0 分母為0的異常情況
通過這兩種方式我們來總結(jié)一下,如果我們在except語句中不指定類型,那么無論test()中出現(xiàn)任何錯誤都會執(zhí)行except語句,如果我們指定了類型的時候,只有指定類型的錯誤發(fā)生的時候才會觸發(fā)這種異常機(jī)制。
2. except代碼塊
except代碼塊就是對于try...except語句的一種擴(kuò)展,對于一個問題可能會出現(xiàn)多種錯誤的情況,那么我們可以對每一種情況都做一定的處理,語法格式如下:
Try: Test() except [異常類型1]: deal except [異常類型2]: deal except [異常類型3]: deal
代碼如下:
def test(): number = int(input('請輸入一個數(shù)字:')) if 15 / number >= 3: print('ok') else: print('wrong') try: test() except ZeroDivisionError: print('分母為0的異常') except ValueError: print('傳入的值異常')
對于這種多except語句的處理機(jī)制,我們輸入0和dotcpp的時候輸出結(jié)果為:
請輸入一個數(shù)字:dotcpp 傳入的值異常 請輸入一個數(shù)字:0 分母為0的異常
3. 總結(jié)
本節(jié)里我們主要學(xué)習(xí)了基礎(chǔ)的ty...except語句的用法,異常類型的選擇決定了我們是否所有異常執(zhí)行except中的語句,所以一定要注意異常類型的選擇,下一節(jié)我們來學(xué)習(xí)try...except語句的嵌套和try...except...else語句。
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點(diǎn)擊了解:
一點(diǎn)編程也不會寫的:零基礎(chǔ)C語言學(xué)練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進(jìn)階課程
從零到寫出一個爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競賽課入門課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程