網站首頁 編程語言 正文
本章節主要學習 python 中的異常處理,來看一下該章節的內容有哪些。首先我們需要了解 什么是異常與異常的處理 ,然后再繼續 異常的語法結構
什么是異常與異常處理
異常 —> 可以理解為不同尋常。
正常情況下,我們的程序是自上而下的逐行執行,執行到最后一行才會終止程序的執行。而異常的情況會導致我們的程序半途而廢停止了執行。一般情況下的停止執行都是因為我們的程序出錯而造成的,而異常就是錯誤,異常的出現會導致我們的程序崩潰并停止運行。這在我們的工作中是非常不友好的!
縱觀程序的一生,都不能保證說程序一定不會出錯。所以當遇到錯誤的時候,為了不影響程序的執行,我們就需要對這些異常進行處理, Python 中的異常機制,可以監控并捕獲到異常。當程序出現錯誤的時候對異常進行臨時妥善的處理,就可以使得程序繼續正常的運行。
總結:
異常的本質就是錯誤
異常的出現會導致程序的崩潰且會停止執行
監控異常并捕獲,將造成異常的程序進行妥善的處理可以使得程序能夠繼續正常的運行
接下來我們就快快的看一下 究竟如何捕獲異常并進行異常處理的語法吧。
異常的語法
try: # 異常的關鍵字,嘗試的意思 <代碼塊1> # 被 try 關鍵字檢查并保護的業務代碼塊 except <異常的類型>: # 發現異常后的處理關鍵字,會跟隨一個錯誤類型(異常類型),異常類型可以不填寫 <代碼塊2> # try 的代碼塊出現錯誤之后,就會執行 except 的代碼塊 # 這里一般都是當 try 代碼塊出現錯誤之后的補救邏輯
來看一個簡單的示例:
1 / 0 # 我們都知道 0 不能被整除,所以產生了下面這樣的報錯 # >>> 執行結果如下 # >>> ZeroDivisionError: division by zero # >>> 我們管代碼的報錯叫做 異常的拋出 ,這個報錯信息告訴了我們為什么報錯,同時業務也會被停止。 # >>> 在程序中,我們是允許出錯的,但是需要對可能遇見的異常捕獲, # >>> 進行合理的處理,讓程序遇到異常可以合理的運行
看一下針對上文示例的異常進行的捕獲
try: 1 / 0 except: print('注意:0 不可以被 1 整除') print('ZeroDivisionError: division by zero 已捕獲,程序繼續執行') # >>> 執行結果如下 # >>> 注意:0 不可以被 1 整除 # >>> ZeroDivisionError: division by zero 已捕獲,程序繼續執行 # >>> 雖然 try 代碼塊拋出了異常,但是我們通過 except 進行了合理的規避,使得我們的程序繼續向下執行
接下來我們再利用我們之前學到的知識點 upper() 函數做一個小案例:
定義一個 upper ,利用 upper() 函數 。將傳入的字符串轉為大寫,如傳入參數非 字符串 ,捕獲該異常并處理。
def upper(str_data): new_str = None try: new_str = str_data.upper() except: print('upper() 函數轉換字符大寫失?。?, '返回結果為:', new_str) return new_str result = upper('test') print('傳入參數返回值為:', result) # >>> 執行結果如下: # >>> 傳入參數返回值為: TEST result = upper(1) print(result) # >>> 執行結果如下: # >>> upper() 函數轉換字符大寫失敗! 返回結果為: None
捕獲通用異常
剛剛我們通過 try…except… 捕獲了異常并進行了合理的處理,但是我們并不知道錯誤的原因是什么。所以我們必須獲取 異常的類型 ,首先我們來學習一下如何獲取通用異常類型, 通用異常類型 是我們無法確定是那種異常的情況下使用的一種捕獲方法。
用法如下:
try: <代碼塊> except Exception as e: # 把通用異常的錯誤原因轉換成變量 e , as 為關鍵字 # 也可以理解為 將 Exception 通用異常類型 起一個別名 e # e 變量名可以起任意名字,一般約定成俗都會使用 e 作為異常捕獲的變量名 # e 就是 error 的縮寫 <異常代碼塊>
通用異常捕獲示例如下:
def upper(str_data): new_str = None try: new_str = str_data.upper() except Exception as e: print('upper() 函數轉換字符大寫失敗!', '返回結果為:{}'.format(e)) return new_str result = upper(1) print(result) # >>> 執行結果如下: # >>> upper() 函數轉換字符大寫失??! 返回結果為:'int' object has no attribute 'upper'
捕獲具體異常
捕獲具體的異常就是我們可以確定在 try 的代碼塊中會出現哪種具體的異常類型,并將其捕獲的方法。語法方面與通用異常一樣,在異常類型區域書寫 具體的異常類型 就可以了。
我們以上文的 ZeroDivisionError: division by zero 為例
try: 1 / 0 except ZeroDivisionError as e: # 書寫指定的異常類型:ZeroDivisionError # ZeroDivisionError 是Python內置的具體異常:0不能被整除 print(e) # >>> 執行結果如下: # >>> division by zero
小節:思考一個問題,工作中我們是使用 通用的異常 還是 具體的異常 呢?
從方便的角度來說,使用通用的異常會比較簡單。開發成本低,不需要關心具體的異常類型是什么。其實 Exception 也不知知道具體的異常是哪一種類型,它需要去浩瀚的異常庫查找,找到之后進行對應的拋出,雖然沒有 具體指定異常 處理的那么快,但是這個處理速度也是無感知的。
如果我們能知道 try 代碼塊中 可能出現的具體異常類型,還是希望使用具體的異常類型。這樣可以精準的對應錯誤;
==需要注意的是:當我們的 try 代碼塊中,沒有出現我們指定的 具體異常 類型,代碼執行依然是會報錯的。==所以各有利弊,可以根據我們工作中業務的具體情況進行使用。
如何捕獲多個異常
在我們平時的開發工作中,很可能在同一個代碼塊中出現多個異常類型。那么我們該如何支持多個異常的捕獲呢?
其實異常的捕獲是非常靈活的,也支持多個異常捕獲的方式。
捕獲多個異常 - 方法1
try: result = 1 / 0 except ZeroDivisionError as e1: print(e1) except Exception as e2: # 可以使用多個 except 來捕獲多個異常 print('this is a public except , bug is %s' % e2) # >>> 需要注意的是,當 except 代碼塊中有多個異常的時候,當捕獲到第一個異常后,不會在繼續往下捕獲。
需要注意的是,當 except 代碼塊中有多個異常的時候,當捕獲到第一個異常后,不會在繼續往下捕獲。
捕獲多個異常 - 方法2
try: result = 1 / 0 except (ZeroDivisionError, Exception) as e: # 在 except 后面的小括號內定義多個 異常類型 ,(小括號其實是元組) # 當 except 后面使用元組包裹多個 異常類型 時,捕獲到哪種異常類型就拋出哪種 print(e)
示例如下:
def test(): try: print(name) # 因為不存在 name 這個變量,所以會拋出一個 NameError: name 'name' is not defined 異常 # 嘗試捕獲 NameError 異常 except (ZeroDivisionError, NameError) as e: print(e) print(type(e)) test() # >>> 執行結果如下: # >>> name 'name' is not defined # >>>
比較常用的捕獲異常方法是第二種。
原文鏈接:https://blog.csdn.net/weixin_42250835/article/details/123468588
相關推薦
- 2022-09-30 Flutter?日歷組件簡單實現_Android
- 2022-07-07 淺談Qt實現HTTP的Get/Post請求_C 語言
- 2022-07-09 kubernetes之資源限制
- 2022-07-13 Docker的資源控制管理
- 2022-12-27 Python中賦值的含義及說明_python
- 2023-01-11 Selenium中的option使用示例_python
- 2022-06-01 如何利用Python將字典轉為成員變量_python
- 2022-06-15 ASP.NET?Core之Web?API介紹_基礎應用
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支