【Python基础知识-pycharm版】第十节_异常
第十節
- 異常
- 異常機制本質
- 異常解決的關鍵:定位
- try... 一個 except 結構
- try... 多個 except 結構
- try...except...else 結 構
- try...except...finally 結構
- return 語句和異常處理問題
- 常見異常的解決
- 常見異常匯總
- with 上下文管理
- trackback 模塊
- 自定義異常類
異常
在實際工作中,我們遇到的情況不可能是非常完美的。比如:你寫的某個模塊,用戶輸入不一定符合你的要求;你的程序要打開某個文件,這個文件可能不存在或者文件格式不對;你要讀取數據庫的數據,數據可能是空的;我們的程序再運行著,但是內存或硬盤可能滿了等等。
軟件程序在運行過程中,非常可能遇到剛剛提到的這些問題,我們稱之為異常,英文是:Exception,意思是例外。遇到這些例外情況,或者叫異常,我們怎么讓寫的程序做出合理的處理,而不至于程序崩潰呢?我們本章就要講解這些問題。
如果我們要拷貝一個文件,在沒有異常機制的情況下,我們需要考慮各種異常情況,偽代碼如下:
偽代碼使用 if 處理程序中可能出現的各種情況
這種方式,有兩個壞處:
那么,我們如何解決應對異常情況呢? python 的異常機制給我們提供了方便的處理方式。如上情況,如果是用 python 的異常機制來處理,示意代碼如下(僅限示意,不能運行):
異常機制本質
異常指程序運行過程中出現的非正常現象,例如用戶輸入錯誤、除數為零、需要處理的文件不存在、數組下標越界等。
所謂異常處理,就是指程序在出現問題時依然可以正確的執行剩余的程序,而不會因為異常而終止程序執行。
python 中,引進了很多用來描述和處理異常的類,稱為異常類。異常類定義中包含了該類異常的信息和對異常進行處理的方法。下面較為完整的展示了python 中內建異常類的繼承層次:
我們處理一下,遇到的第一個異常:
python 中一切都是對象,異常也采用對象的方式來處理。處理過程:
異常解決的關鍵:定位
當發生異常時,解釋器會報相關的錯誤信息,并會在控制臺打印出相關錯誤信息。我們只需按照從上到下的順序即可追(Trackback)錯誤發生的過程,最終定位引起錯誤的那一行代碼。
【示例】追溯異常發生的過程
try… 一個 except 結構
try…except 是最常見的異常處理結構。結構如下:
try:
被監控的可能引發異常的語句塊
except BaseException [as e]:
異常處理語句塊
try 塊包含著可能引發異常的代碼,except 塊則用來捕捉和處理發生的異常。執行的時候,如果 try 塊中沒有引發異常,則跳過 ecept 塊繼續執行后續代碼;執行的時候,如果 try塊中發生了異常,則跳過 try 塊中的后續代碼,跳到相應的 except 塊中處理異常;異常處理完后,繼續執行后續代碼。
示例:循環輸入數字,如果不是數字則處理異常;直到輸入 88,則結束循環。
while True:try:x= int(input('請輸入一個數字:'))print('您輸入的數字是:',x)if x==88:print('退出程序')breakexcept:print('異常:輸入的不是一個數字') 請輸入一個數字:89 您輸入的數字是: 89 請輸入一個數字:88 您輸入的數字是: 88 退出程序Process finished with exit code 0try… 多個 except 結構
上面的結構可以捕獲所有的異常,工作中也很常見。但是,從經典理論考慮,一般建議盡量捕獲可能出現的多個異常(按照先子類后父類的順序),并且針對性的寫出異常處理代碼。為了避免遺漏可能出現的異常,可以在最后增加 BaseException。結構如下:
try:
被監控的、可能引發異常的語句塊
except Exception1:
處理 Exception1 的語句塊
except Exception2:
處理 Exception2 的語句塊
…
except BaseException:
處理可能遺漏的異常的語句塊
示例:多個 except 結構
try:a=input('請輸入被除數:')b=input('請輸入除數:')c=float(a)/float(b)print(c)except ZeroDivisionError:print('異常:除數不能為0') except TypeError:print('異常:除數和被除數都應該為數值類型') except NameError:print('異常:變量名不存在') except BaseException as e:print(e)print(type(e)) 請輸入被除數:20 請輸入除數:0 異常:除數不能為0Process finished with exit code 0try…except…else 結 構
try…except…else 結構增加了“else 塊”。如果 try 塊中沒有拋出異常,則執行 else 塊。如果try 塊中拋出異常,則執行 except 塊,不執行 else 塊。
try:a=input('請輸入被除數:')b=input('請輸入除數:')c=float(a)/float(b) except BaseException as e:print(e) else:print('除的結果是:',c)沒有發生異常的執行情況(執行完 try 塊后,執行 else):
請輸入被除數:25 請輸入除數:0 float division by zeroProcess finished with exit code 0 請輸入被除數:50 請輸入除數:2 除的結果是: 25.0Process finished with exit code 0try…except…finally 結構
try…except…finally 結構中,finally 塊無論是否發生異常都會被執行;通常用來釋放 try 塊中申請的資源。
【示例】try…except…finally 結構簡單測試
【示例】讀取文件,finally 中保證關閉文件資源
try:f= open('d:/a.txt',r)content=f.readline()print(content) except BaseException as e:print(e) finally:f.close() #釋放資源。此處也可能會發生異常。若發生異常則程序終止,不會繼續往下執行 print('step4') Traceback (most recent call last): name 'r' is not definedFile "D:/PycharmProjects/MyTest/Day0723/myerror01.py", line 117, in <module>f.close() #釋放資源。此處也可能會發生異常。若發生異常則程序終止,不會繼續往下執行 NameError: name 'f' is not definedProcess finished with exit code 1return 語句和異常處理問題
由于 return 有兩種作用:結束方法運行、返回值。我們一般不把 return 放到異常處理結構中,而是放到方法最后。
【示例】return 和異常結構的正確處理方式
常見異常的解決
Python 中的異常都派生自 BaseException 類,本節我們測試和列出常見的一些異常,方便初學者掌握。
常見異常匯總
with 上下文管理
finally 塊由于是否發生異常都會執行,通常我們放釋放資源的代碼。其實,我們可以通過 with 上下文管理,更方便的實現釋放資源的操作。
with 上下文管理的語法結構如下:
with context_expr [ as var]:
語句塊
with 上下文管理可以自動管理資源,在 with 代碼塊執行完畢后自動還原進入該代碼之前的現場或上下文。不論何種原因跳出 with 塊,不論是否有異常,總能保證資源正常釋放。極大的簡化了工作,在文件操作、網絡通信相關的場合非常常用。
【示例】with 上下文管理文件操作
trackback 模塊
【示例】使用 Traceback 模塊打印異常信息
【示例】使用 traceback 將異常信息寫入日志文件
自定義異常類
程序開發中,有時候我們也需要自己定義異常類。自定義異常類一般都是運行時異常,通常繼承 Exception 或其子類即可。命名一般以 Error、Exception 為后綴。
自定義異常由 raise 語句主動拋出。
【示例】自定義異常類和 raise 語句
#測試自定義異常類class AgeError(Exception): #繼承Exceptiondef __init__(self,errorInfo):Exception.__init__(self)self.errorInfo=errorInfodef __str__(self):return str(self.errorInfo)+'年齡錯誤!應該在1-150之間'######################測試代碼################################ if __name__=='__main__': #如果為ture,則模塊是作為獨立文件運行,可以執行測試代碼age= int(input('輸入一個年齡:'))if age<1 or age>150:raise AgeError(age)else:print('正常的年齡:',age) 輸入一個年齡:300 Traceback (most recent call last):File "D:/PycharmProjects/MyTest/Day0723/myerror01.py", line 149, in <module>raise AgeError(age) __main__.AgeError: 300年齡錯誤!應該在1-150之間Process finished with exit code 1總結
以上是生活随笔為你收集整理的【Python基础知识-pycharm版】第十节_异常的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 间隔定时器,Linux间隔定
- 下一篇: 【机器学习】sklearn数据集获取、分