<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
最近發現有些東西長時間不用就要忘了,堅持每天覆習總結一個小知識點吧~
異常是什麼呢?就是在程式碼執行過程中非預期的執行結果,隨著程式碼越來越複雜,程式碼中的執行邏輯也會越來越複雜,如果沒有處理好異常情況,很有可能造成軟體執行錯誤,導致重大損失。相反,如果合理的處理異常情況,則可以增強軟體的穩定性,提高體驗感。
在Python
中,使用異常物件(exception object)
來表示程式碼執行過程中所發生的異常情況,當執行程式爆出錯誤的時候則會丟擲異常。
如果沒有正確處理異常,則會終止執行。
你可以想象一下,如果你在開發一款產品時,出現異常而不報告出發生異常的原因,是不是會很難受,也很難解決異常的問題。
為了提高產品的穩定性與靈活性,Python
執行開發者捕捉並處理各類異常,一般的內部模組報錯如KeyError異常類
較為常見,當然也有很多其他的。
簡單瞭解下,Python將程式碼執行錯誤分為兩類:語法錯誤(syntax error)
和異常(exception)
。
首先,是語法錯誤的問題。字面可知,程式碼解析錯誤。
這種錯誤通常出現在初學者,主要原因是所執行的程式碼不符合Python語法的規範,故會報出語法錯誤導致code停機。
下面給出一個錯誤示範:
>>> if for not in list(1,2,3,4) File "<stdin>", line 1 if for not in list(1,2,3,4) ^ SyntaxError: invalid syntax
從上面的報錯中可以知道是語法錯誤,無效的語法。並且指出了錯誤的地方在for
的位置,很顯然if
和for
不能用在一起。
異常則是在程式碼執行過程中發現的錯誤,這是很難提前被發現的,即使程式碼寫的很規範標準,但也可能會出現執行異常的情況。
下面給出一個錯誤範例。經常被提到的是除數為0的情況,數學運算中,0是不可以作為除數的,如果作為除數則會爆出異常。
>>> a = 5 / 0 Traceback (most recent call last): File "<stdin>", line 1, in <module> ZeroDivisionError: division by zero
很明顯報錯指出0作為除數是不對的。
當我們瞭解了錯誤和異常後,就得處理異常情況。對於語法錯誤這種問題多多練習即可避免,對於第二種異常,python
給出了try-except
語句來處理。
為了更清晰的解釋,還是以上面的除數為0的情況作為例子,我們通過新增try-except
語句捕捉並處理異常情況:
def division(x, y): try: return x / y except ZeroDivisionError: print("0不能作為除數!!!")
然後我們再在terminal呼叫函數試試:
division(x=1, y=0)
輸出:
0不能作為除數!!!
雖然我們的輸入是錯誤的理論應該報錯,但是並沒有報錯而且還返回了一段話。
下面解釋一下try-except
語句的工作原理:
當然,我們寫的程式碼可能不止出現一種異常情況,我們可以將所有異常寫在一個except語句中,如下所示:
except (RuntimeError, TypeError, NameError):pass
如果捕捉到異常列表中的任意一項異常表示式,則都會進入except
處理。
當然,如果你想對每一種異常進行單獨處理也可以一個一個的分開進行處理:
def passpass(x=1): try: return print(x+x) except (RuntimeError, TypeError, NameError): pass except TypeError: print('引數錯誤啦~') except NameError: print('名稱錯誤啦~')
今天先到這裡明兒再更,去跳繩了,哎,每天卷卷卷,老北京雞內卷啊~(2022.4.20)
Python的異常型別是可以繼承的, 我們在此僅需知道,若except後指定的異常繼承自前面異常,由此後面的異常也會被捕捉到,範例如下:
class A(Exception): pass class B(A): pass class C(B): pass for cls in [A, B, C]: try: raise cls() except C: print('C') except B: print('B') except A: print('A')
則會輸出:
A
B
C
相反,如果把except的順序倒過來,則只會輸出A,由於異常B和C都繼承來自A,由此在捕捉到B異常後則會終止:
class A(Exception): pass class B(A): pass class C(B): pass for cls in [A, B, C]: try: raise cls() except A: print('A') except B: print('B') except C: print('C')
輸出全為A:
A
A
A
如果所有異常都一一的提取出來,這會很麻煩,此時可以在最後的一個except中不設定異常型別,由此剩下沒有被捕獲的異常全會被捕捉:
def passpass(x=1): try: return print(x/x) except TypeError: print('引數錯誤啦~') except NameError: print('名稱錯誤啦~') except: print('報錯啦~自己查')
一個重要功能:else.
else語句則是用來執行一些額外操作,如try程式碼塊中執行了一些檔案操作,在else中可以釋放資源,else的語法格式如下:
try: pass except: pass else: pass
當然我們還可以操作異常,如下:
def passpass(x=1): try: return print(x/x) except TypeError as error: print('引數錯誤啦~', error) except NameError: print('名稱錯誤啦~') except: print('報錯啦~自己查')
開發者在平常的有些情況下並沒有執行錯誤,但是不符合設計邏輯,由此需要開發者主動丟擲異常,這時我們需要使用raise語句丟擲異常:
>>> raise NameError('HiThere') Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: HiThere
Python內建異常無法滿足開發需求的時候,可以自定義異常。
自定義異常類必須要直接或間接繼承自Exception類。自定義異常類可以像其他類一樣做任何事情,但原則上要保持簡潔,提高一些屬性即可。
class Error(Exception): """Base class for exception 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 winerror """ def __init__(self, expression, message): self.expression = expression self.message = message
else在程式碼正常執行後才會被執行的程式碼塊,但有些情況無論程式碼塊是否出現異常都要執行,則需要用到finally語句:
def passpass(x=1): try: return print(x/x) except TypeError as error: print('引數錯誤啦~', error) except NameError: print('名稱錯誤啦~') except: print('報錯啦~自己查') finally: print('運算結束~')
到此這篇關於Python基礎教學之例外處理的文章就介紹到這了,更多相關Python例外處理內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45