周末多碼文,昨天晚上一篇,今天再來一篇:
線上程式設計:https://mybinder.org/v2/gh/lotapp/BaseCode/master
線上預覽:http://github.lesschina.com/python/base/oop/3.異常相關.html
代碼褲子:https://github.com/lotapp/BaseCode/tree/master/python/2.OOP/4.Exception
又到了開新課的時候了,小明同學這次提前預習了知識,乘着老師還沒來就在黑闆上寫下了這段Code:
In [1]:
小潘同學剛進來就看見了,自語道:“<code>try...except</code>捕獲異常誰不會?就會這麼屁點東西還好意思秀,切~ 我給你把 格式補全”
于是乘着小明上廁所的時候,擦掉小明的Code,自己寫了一段高大上的Code:
In [2]:
這時候小明和老師一起進來了,同學們隐約間都聽到小明的自誇聲:“老師,我可好了,提前預習并且還寫了個demo在黑闆上呢~”
老師一進門看着黑闆就笑了,同學們也笑成一片。小明心想,咦~難道我寫錯了?定眼一看黑闆,氣呼呼的回座位了
<code>else</code>可以不寫,不過我們 基本上還是會寫的,畢竟可以知道是真的沒有錯誤,而不是屏蔽了錯誤
老師很欣慰,覺得這個班真有意思,大家學習空前熱情,為了照顧小明,老師反問道:“有誰知道 多個異常怎麼處理?”
小明飛快的舉手并把黑闆上内容擦完,寫下了如下代碼:
In [3]:
老師問了小明一聲,有幾個輸出?
小明驕傲的說道:“兩個,我寫了兩個異常處理,當然都執行了”
同學們又笑了,小潘調侃的說了句:“一看就知道去年C#沒好好學,這不都一樣嘛,遇到異常下面代碼還執行嗎?用腦子好好想想”
當我們認為某些代碼可能會出錯時,就可以用<code>try</code>來運作這段代碼,如果執行出錯,則後續代碼不會繼續執行,而是直接跳轉至<code>except</code>語句塊,執行完<code>except</code>後,如果有<code>finally</code>語句塊,則執行finally語句塊
小明又尴尬了。。。
老師再次幫小明圓了個場:“已經很不簡單了,就是最後小得意的時候口誤了,那小明同學你知道Python裡面多異常有個便捷寫法嗎?”
小明趕緊拿起粉筆刷刷刷的寫完,然後說道:“of course”
In [4]:
老師趕緊誇了誇小明,心想,哎呦喂終于把這難纏的家夥弄回座位了。
小明走前還不忘說一句:“簡寫的時候注意格式哦,是 元組 不是逗号分隔”
老師這堂課很輕松,大家都預習了而且内容也比較簡單。
接着以提問的方式問道:“小潘同學,你知道異常的基類是什麼嗎?如果要捕獲所有異常該怎麼做呢?”
小潘站起來說道:“是<code>BaseException</code>”
老師擴充道:“所有的錯誤類型都繼承自<code>BaseException</code>,是以在使用<code>except</code>時需要注意的是,它不但捕獲該類型的錯誤,還把其子類也一起捕獲了”
是以一般在捕獲異常的時候 把子類異常放在前面,父類放在後面
看如下代碼:
In [5]:
如果把父類放第一個,那麼<code>ZeroDivisionError</code>永遠也不會被執行了,其實你如果裝了 代碼規範提示插件會提示你的
可以參考我之前寫的 vscode設定python3調試環境的擴充部分
來個通用異常捕獲的簡寫(官方不推薦使用簡寫):
In [6]:
老師繼續講到,我們來看一個場景,現在很多線上編輯器,你在他們那些編輯框裡寫下了代碼也是有異常抛出的,這是怎麼處理的呢?
微軟有開源代碼編輯器比較受歡迎(VSCode的一部分):monaco-editor
提示一下,如果真的要做線上編輯器,記得考慮一下<code>fork炸彈</code>,這個其實也是很老的東西了,程式員基本上都應該接觸過了
我們繼續,像C#是用<code>thorw</code>抛出異常,那Python怎麼 <code>捕獲異常後再抛出</code> 呢?怎麼<code>自定義異常</code> 呢?
繼續往下看:
In [7]:
In [8]:
異常這一塊基本上講完了(<code>logging</code>子產品後面會說)有什麼補充的可以說的^_^
小明又進行了C#的代碼轉換,怎麼看都覺得還是C#簡單啊,根本不用說啥,代碼一貼就秒懂了。。。
你可以自定義異常類,繼承Exception即可,對了C#裡面也是有finally的
現在一些需要finally的地方基本上都被using(){}接管了,是以特定場景會使用
先這樣了
作者:毒逆天
出處:https://www.cnblogs.com/dotnetcrazy
打賞:<b>18i4JpL6g54yAPAefdtgqwRrZ43YJwAV5z</b>
本文版權歸作者和部落格園共有。歡迎轉載,但必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接!