一篇文章帶你弄懂Python異常傳遞和自定義異常
回復“Go語言”即可獲贈從入門到進階共10本電子書
大家好,我是Go進階者,今天給大家分享一些Python基礎(chǔ) (異常傳遞和自定義異常),上篇文章有說到:一篇文章帶你弄懂Python異常簡介和案例分析,這篇文章一起來看看異常其他知識吧~
一、異常的傳遞
1. try嵌套中
import timetry:f = open('test.txt')try:while True:content = f.readline()if len(content) == 0:breaktime.sleep(2)finally:f.close()print('關(guān)閉文件')except :print("沒有這個文件")finally:print("最后的finally")# 這是test.txt文件中讀取到信息
運行結(jié)果:

2. 函數(shù)嵌套調(diào)用中
def test1():print("----test1-1----")print(num)print("----test1-2----")def test2():print("----test2-1----")test1()print("----test2-2----")def test3():try:print("----test3-1----")test1()print("----test3-2----")except Exception as result:print("捕獲到了異常,信息是:%s"%result)print("----test3-2----")test3()print("------華麗的分割線-----")test2()
運行結(jié)果:

小總結(jié):
如果try嵌套,那么如果里面的try沒有捕獲到這個異常,那么外面的try會接收到這個異常,然后進行處理,如果外邊的try依然沒有捕獲到,那么再進行傳遞。
如果一個異常是在一個函數(shù)中產(chǎn)生的,例如函數(shù)A---->函數(shù)B---->函數(shù)C,而異常是在函數(shù)C中產(chǎn)生的,那么如果函數(shù)C中沒有對這個異常進行處理,那么這個異常會傳遞到函數(shù)B中,如果函數(shù)B有異常處理那么就會按照函數(shù)B的處理方式進行執(zhí)行;如果函數(shù)B也沒有異常處理,那么這個異常會繼續(xù)傳遞,以此類推。。。如果所有的函數(shù)都沒有處理,那么此時就會進行異常的默認處理。
二、拋出自定義的異常
你可以用raise語句來引發(fā)一個異常。異常/錯誤對象必須有一個名字,且它們應是Error或Exception類的子類
下面是一個引發(fā)異常的例子:
class ShortInputException(Exception):'''自定義的異常類'''def __init__(self, length, atleast):#super().__init__()self.length = lengthself.atleast = atleastdef main():try:s = input('請輸入 --> ')if len(s) < 3:# raise引發(fā)一個你定義的異常raise ShortInputException(len(s), 3) #自定義異常長度為3。except ShortInputException as result:#x這個變量被綁定到了錯誤的實例print('ShortInputException: 輸入的長度是 %d,長度至少應是 %d'% (result.length, result.atleast))else:print('沒有異常發(fā)生.')main()
運行結(jié)果:

以上程序中,關(guān)于#super().init()代碼的說明:
這一行代碼,可以調(diào)用也可以不調(diào)用,建議調(diào)用。
因為__init__方法往往是用來對創(chuàng)建完的對象進行初始化工作,如果在子類中重寫了父類的__init__方法,即意味著父類中的很多初始化工作沒有做,這樣就不保證程序的穩(wěn)定了,所以在以后的開發(fā)中,如果重寫了父類的__init__方法,最好是先調(diào)用父類的這個方法,然后再添加自己的功能。
三、異常處理中拋出異常
class Test(object):def __init__(self, switch):self.switch = switch #開關(guān)def calc(self, a, b):try:return a/bexcept Exception as result:if self.switch:print("捕獲開啟,已經(jīng)捕獲到了異常,信息如下:")print(result)else:#重新拋出這個異常,此時就不會被這個異常處理給捕獲到,從而觸發(fā)默認的異常處理raisea = Test(True)a.calc(11,0)print("----------------------華麗的分割線----------------")a.switch = Falsea.calc(11,0)
運行結(jié)果:

四、總結(jié)
本文基于Python基礎(chǔ),詳細的講解了運行過程中遇到各種異常,應該采取什么樣的處理方式,對各種異常提供有效的解決方案。通過一個個小項目實際操作,運行結(jié)果展示,能夠更好的解決問題。希望可以幫助你更好的學習Python。
------------------- End -------------------
往期精彩文章推薦:

歡迎大家點贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持
想加入Go學習群請在后臺回復【入群】
萬水千山總是情,點個【在看】行不行
