Python的異常問題(Python Exception)
更新時間:2023年08月11日 09:05:59 作者:子黃求知若渴
這篇文章主要介紹了Python的異常問題(Python Exception),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
異常 Exception
錯誤
- 在編寫代碼時能夠避免的
- 語法錯誤:未按照代碼限制進行編寫,或者手誤拼錯了變量名等
- 邏輯錯誤:思維方向出現(xiàn)了問題,算法不正確等。
異常
- 編寫代碼階段無法避免的,與運行時環(huán)境相關(guān)的錯誤。例如打開的文件不存在,網(wǎng)絡中斷等。
- 異常是可追溯的,Python中使用Tranceback來追溯異常。
Python中的Exception
- Python中提供了一系列異常類和try語句塊來捕獲和處理異常。
- 如果程序中觸發(fā)了異常,當前函數(shù)未捕獲則會向外拋出拋給調(diào)用者,直到被捕獲或者拋到Python解釋器,解釋器停止當前線程,如若是主線程,也結(jié)束當前進程。
- 當程序出現(xiàn)異常時,將會導致后續(xù)的進行不可控,所以異常未處理終止線程的操作是很有必要的。
- 異常出現(xiàn)導致的后果十分嚴重,需要在拋到解釋器前進行處理。
raise
- 使用raise Exception來顯式拋出異常。
- raise會拋出一個所跟的異常類實例,如果跟的是一個類,則無參地初始化后拋出。
- 在except中或者finally中可以使用不跟對象的raise,會拋出最近觸發(fā)的一個異常。
raise Exception # 使用無參初始化 raise Exception('Exception', 200) #帶參初始化 try: raise Exception() except: raise # 拋出上面的異常實例
try語句塊
語句 | 作用 |
---|---|
try | 在try后except前的語句將會由except來捕獲 |
except | 語句后跟一個異常類(繼承自BaseException或其子類),該except會捕捉該類或其子孫類實例。如果未捕獲到且后續(xù)還有except語句則會由后續(xù)語句繼續(xù)捕獲,如果到最后一個except語句仍未被捕獲,則拋出到調(diào)用者??梢栽陬惡蟾?as e ,在as后跟一個變量會將捕獲到的異常類實例賦給變量。 |
finally | 在finally語句中的語句不管是否發(fā)生異常都會被執(zhí)行 |
else | 如果沒有發(fā)生異常,執(zhí)行else中的語句 |
- try語句后必須有exception或finally語句二者其一。
- 在exception或者finally中如果有return或者break語句,執(zhí)行語句時會忽視該異常。
try: 1 / 0 # 將會觸發(fā)0除異常 ZeroDivisionError except SystemExit as e: # 不是ZeroDivisionError異常的祖先類,捕獲不到 print('SystemExit', e) except ZeroDivisionError as e:# 捕獲ZeroDivisionError異常 print('ZeroDivisionError', e) else: print('else') # 有異常,else語句不執(zhí)行 finally: print('fianlly') >>>ZeroDivisionError division by zero >>>finally try: x = 1 # 不產(chǎn)生異常 except SystemExit as e: print('SystemExit', e) except ZeroDivisionError as e: print('ZeroDivisionError', e) else: print('else') # 沒有異常,else語句被執(zhí)行 finally: print('fianlly') # finally中的語句依舊被執(zhí)行 >>>else >>>finally
捕獲策略
- 如果異常不處理,則會向上一層,即調(diào)用者拋出,直到解釋器。
- 所以可以在發(fā)生處到解釋器途中進行捕獲處理,所以在哪個位置進行處理也是一個問題。
立即捕獲
在異常發(fā)生處直接捕獲進行處理。
- 發(fā)生后直接就處理了,不向外拋出,消耗最小,最高效。
- 用戶不需要管是否發(fā)生了異常,只要處理了即可。
- 可能不是調(diào)用者想要的結(jié)果,有點過于自作主張了。
def get_int(data): """ 轉(zhuǎn)換一個值為int類型 """ try: return int(data) except: return 0
發(fā)生異常后直接返回一個固定的值,而不向外拋出。
調(diào)用者無需處理該異常,有時返回的結(jié)果不符合預期。
邊界捕獲
封裝產(chǎn)生邊界
- 在設計模塊或者其他服務的時候,發(fā)生異常應該交由調(diào)用者來處理。如果自行處理,調(diào)用者無法察覺并處理該異常
- 例如內(nèi)建函數(shù)open,文件不存在會拋出FileNotFoundError異常,把處理權(quán)交由用戶。用戶不處理則線程退出。
類繼承樹
BaseException +-- SystemExit +-- KeyboardInterrupt +-- GeneratorExit +-- Exception +-- StopIteration +-- StopAsyncIteration +-- ArithmeticError | +-- FloatingPointError | +-- OverflowError | +-- ZeroDivisionError +-- AssertionError +-- AttributeError +-- BufferError +-- EOFError +-- ImportError | +-- ModuleNotFoundError +-- LookupError | +-- IndexError | +-- KeyError +-- MemoryError +-- NameError | +-- UnboundLocalError +-- OSError | +-- BlockingIOError | +-- ChildProcessError | +-- ConnectionError | | +-- BrokenPipeError | | +-- ConnectionAbortedError | | +-- ConnectionRefusedError | | +-- ConnectionResetError | +-- FileExistsError | +-- FileNotFoundError | +-- InterruptedError | +-- IsADirectoryError | +-- NotADirectoryError | +-- PermissionError | +-- ProcessLookupError | +-- TimeoutError +-- ReferenceError +-- RuntimeError | +-- NotImplementedError | +-- RecursionError +-- SyntaxError | +-- IndentationError | +-- TabError +-- SystemError +-- TypeError +-- ValueError | +-- UnicodeError | +-- UnicodeDecodeError | +-- UnicodeEncodeError | +-- UnicodeTranslateError +-- Warning +-- DeprecationWarning +-- PendingDeprecationWarning +-- RuntimeWarning +-- SyntaxWarning +-- UserWarning +-- FutureWarning +-- ImportWarning +-- UnicodeWarning +-- BytesWarning +-- ResourceWarning
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
python matplotlib繪圖,修改坐標軸刻度為文字的實例
今天小編就為大家分享一篇python matplotlib繪圖,修改坐標軸刻度為文字的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05Django執(zhí)行python?manage.py?makemigrations報錯的解決方案分享
相信用過很多Django makemigrations的人都會遇到過makemigrations時會發(fā)生報錯,下面這篇文章主要給大家介紹了關(guān)于Django執(zhí)行python?manage.py?makemigrations報錯的解決方案,需要的朋友可以參考下2022-09-09python如何將多個模型的ROC曲線繪制在一張圖(含圖例)
這篇文章主要給大家介紹了關(guān)于python如何將多個模型的ROC曲線繪制在一張圖的相關(guān)資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2022-02-02python Pandas如何對數(shù)據(jù)集隨機抽樣
這篇文章主要介紹了python Pandas如何對數(shù)據(jù)集隨機抽樣,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-07-07python調(diào)用百度REST API實現(xiàn)語音識別
這篇文章主要為大家詳細介紹了python調(diào)用百度REST API實現(xiàn)語音識別,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-08-08python實現(xiàn)apahce網(wǎng)站日志分析示例
這篇文章主要介紹了python實現(xiàn)apahce網(wǎng)站日志分析示例,需要的朋友可以參考下2014-04-04