15.Python 異常處理和程序調試

1. 異常處理

異常就是在程序執行過程中發生的超出預期的事件。一般情況下,當程序無法正常執行時,都會拋出異常。

  • 在開發過程中,由于疏忽或考慮不周,出現的設計錯誤。因此,在后期程序調試中應該根據錯誤信息,找到出錯位置,并對錯誤代碼進行分析和排錯。
  • 難以避免的運行問題,如讀寫權限不一致、網絡異常、文件不存在、內存溢出、數據類型不一致等。針對這類異常,在設計時可以主動捕獲異常,防止程序意外終止。
  • 主動拋出異常。在程序設計中,可以根據設計需要主動拋出異常,引導程序按照預先設計的邏輯運行,防止用戶不恰當地操作。

當發生異常時,一般應該捕獲異常,并妥善處理。如果異常未被處理,程序將終止運行,因此為程序添加異常處理,能使程序更健壯。

異常也是一種類型,所有的異常實例都繼承自BaseException基類。使用Exception可以捕獲所有類型的異常。

使用try…except語句可以捕獲和處理異常,語句格式如下:

try:   # 捕獲異常<執行語句>
except [異常類型[ as 別名]]: # 處理異常<處理語句>

把目標代碼放在try語句中,在except關鍵字后面設置可選的異常類型。如果省略異常類型,則表示捕獲全部異常類型。如果類型的名稱比較長,可以使用as關鍵字設置別名,方便在異常處理中引用。如果不需要處理異常,可以在except代碼塊中使用pass語句忽略。

try:'1' + 0 # 錯誤運算
except: # 捕獲所有的異常print('發生錯誤') # 提示錯誤信息try:f = open('test.txt','r') # 打開不存在的文件
except IOError as e:  # 捕獲IOError類型異常print('錯誤編號:%s,錯誤信息:%s'%(e.errno,e.strerror)) #顯示錯誤信息try:f = open('test.txt','r') # 打開不存在的文件
except Exception as e:  # 捕獲IOError類型異常print('錯誤編號:%s,錯誤信息:%s'%(e.errno,e.strerror)) #顯示錯誤信息

使用except語句可以同時處理多個異常,語法格式如下:

# 多個異常類型以元組形式進行設置,當try代碼發生其中一個,都被except處理。
try: # 捕獲異常<執行語句>
except ([Exception1[,Exception2,...,ExceptionN]]) [ as 別名]: # 處理異常<處理語句># 多個異常類型按優先順序分別進行處理
try: # 捕獲異常<執行語句>
except ([Exception1[,Exception2]]) [ as 別名]:<處理語句1>
...
except [Exception]:<處理語句N># 樣例
li = [] # 定義空列表
try:print(c) # 發生NameError異常print(3/0) # 發生ZeroDivisionError異常li[2] # 發生IndexError異常a = 123 + 'hello world'  # 發生TypeError異常
except NameError as e:print('出現NameError異常!',e)
except ZeroDivisionError as e:print('出現ZeroDivisionError異常!',e)
except IndexError as e:print('出現IndexError異常!',e)
except TypeError as e:print('出現TypeError異常!',e)
except Exception as e:print('出現其它異常!',e)

try代碼塊中可以嵌套使用try…except結構,設計多層嵌套的異常處理結構,異常對象可以從內向外逐層向上傳遞。

try:try:try:f = open('test.txt','r') # 打開并不存在的文件except NameError as e: # 捕獲未聲明的變量異常print('NameError')except IndexError as e: # 捕獲索引超出異常print('IndexError')
except IOError as e: # 獲取輸入或輸出的異常print('IOError')# 輸出:IOError

try…except異常處理結構允許附帶一個可選的else子句,用來設計當沒有發生異常時,正常處理的代碼塊。else子句在異常發生時,不會被執行,只有當異常沒有發生時才會執行。

try: # 捕獲異常<執行語句>
except [異常類型][ as 別名]: # 處理異常<異常處理語句>
else: # 當異常未發生時執行<正常處理語句>try:f = open('test.txt','r') # 打開文件
except:  # 如文件打開異常,則執行此print('出錯了')
else: # 如文件正常打開,則執行此print(f.read()) # 讀取文件內容try:f = open('test.txt','r') # 打開文件print(f.read()) # 如文件打開異常,則不執行此
except: # 如文件打開異常,則執行此print('出錯了')

善后處理try…except異常處理結構還可以帶一個可選的finally子句,它表示無論異常是否發生,最后都要執行finally語句塊。

try: # 捕獲異常<執行語句>
except [異常類型][ as 別名]: # 處理異常<異常處理語句>
else: # 當異常未發生時執行<正常處理語句>
finally: # 不管異常是否發生,最后都要執行<最后必須處理語句>import time 
i = 1 
while True: # 無限循環try:print(i) # 打印變量continue # 退出執行下一次循環print('永不執行') # 不執行該句finally: time.sleep(1) # 暫停1si += 1 # 遞增變量continue # 退出執行下一次循環print('永不執行') # 不執行語句

拋出異常:使用raise語句主動拋出一個異常,這樣可以確保程序根據開發人員的設計邏輯執行,也可以對用戶的行為進行監控,避免意外操作。

raise [Exception[(args[,traceback])]]

raise 語句3種用法:

  • raise:單獨一個raise。該語句將引發當前上下文捕獲的異常,默認引發RuntimeError異常。
  • raise 異常類名稱:raise 后帶一個異常類名稱,表示引發執行指定類型的異常。
  • raise 異常類名稱(描述信息):在引發指定類型的異常時,顯示異常的描述信息。
try:a = input('輸入一個數')if (not a.isdigit()):raise
except RuntimeError as e:print('引發異常:',repr(e)) # 引發異常: RuntimeError('No active exception to reraise')def test(num):try:if type(num) != int: # 如果為非數字的值,則拋出TypeError錯誤raise TypeError('參數不是數字') if num <= 0: # 如果為非正整數,則拋出ValueError錯誤raise ValueError('參數為不大于0的整數')print(num) # 打印數字except Exception as e:print(e) # 打印錯誤信息
test('1') # 參數不是數字
test(0) # 參數為不大于0的整數
test(2) # 2

自定義異常:自定義異常類型必須直接或間接繼承Exception類。

class MyError(Exception):def __init__(self,msg):self.msg=msgdef __str__(self):return self.msg
try:raise MyError('自定義錯誤信息') # 主動拋出自定義錯誤
except MyError as e:print(e) # 打印:自定義錯誤信息

跟蹤異常:使用traceback可以跟蹤異常,記錄異常發生時有關函數調用的堆棧信息。具體格式如下:

import traceback
try:1/0
except Exception as e:traceback.print_exc() # 打印詳細的錯誤信息traceback.format_exc() # 格式化字符串的形式返回錯誤信息# 把錯誤信息直接保存到外部文件中traceback.print_exc(file=open('log.log',mode='a',encoding='utf-8'))

2. 程序調試

在編寫程序中,常見錯誤有兩種:語法錯誤和異常。語法錯誤又稱解析錯誤,SyntaxError: invalid syntax 。

在這里插入圖片描述

即使語句或表達式在語法上是正確的,但在執行時也可能會引發錯誤,該錯誤稱為異常,異常如果不被捕獲,被程序處理,則會中止程序,并顯示異常提示信息。

在這里插入圖片描述

使用assert語句可以定義斷言,斷言用于判斷一個表達式,在表達式條件為Flase的時候觸發異常,而不必等待程序運行后出現崩潰的情況。

def foo(s):n = int(s)assert n != 0,'n is zero!' # 設置斷言return 10/n
def main():foo('0')main()# 在交互式模式中,可以使用-O參數關閉 assert
python -O test1.py

使用pdb,pdb 是Python自帶的一個包,提供了一種交互的源代碼調試功能,主要特性包括:設置斷點、單步調試、進入函數調試、查看當前代碼、查看棧片段、動態改變變量的值等。pdb常用的調試命令:

  • break或b:設置斷點。
  • continue或c:繼續執行程序。
  • list或l:查看當前行的代碼段。
  • step或s:進入函數。
  • return或r:執行代碼直到從當前函數返回。
  • exit或q:中止并退出。
  • next或n:執行下一行。
  • p val:打印變量的值。
  • help:幫助。
# 新建test1.py文件,代碼如下
s = '0'
n = int(s)
print(10/n)
# cd 命令進入到test1.py文件所在目錄
cd edition_master
# 啟動pdb調試器
python -m pdb test1.py
# 執行操作
l # 查看當前行的代碼段
n # 下一步
p s # 打印變量s
q # 退出

當程序代碼較多時,在可能出錯的地方插入pdb.set_trace(),則不需要單步執行。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/165602.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/165602.shtml
英文地址,請注明出處:http://en.pswp.cn/news/165602.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

系統高可用設計-有感

文章目錄 系統設計原則是 冗余 取舍系統運維的原則是規避線上異常 高可用設計通常從 系統設計和 系統運維 2 個層面來著手突破。 系統設計原則是 冗余 取舍 冗余&#xff1a;指集群部署 故障轉移取舍&#xff1a;常見手段包括&#xff1a;超時控制、降級、限流 系統運維…

音視頻項目—基于FFmpeg和SDL的音視頻播放器解析(二十)

介紹 在本系列&#xff0c;我打算花大篇幅講解我的 gitee 項目音視頻播放器&#xff0c;在這個項目&#xff0c;您可以學到音視頻解封裝&#xff0c;解碼&#xff0c;SDL渲染相關的知識。您對源代碼感興趣的話&#xff0c;請查看基于FFmpeg和SDL的音視頻播放器 如果您不理解本…

springboot(ssm災害應急救援平臺 應急管理平臺Java(codeLW)

springboot(ssm災害應急救援平臺 應急管理平臺Java(code&LW) 開發語言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服務器&#xff1a;tomcat 數據庫&#xff1a;mysql 5.7&#xff08;或8.0&#x…

AOP(面向切面編程)

AOP是針對面向對象編程的一種補充&#xff0c;有時使用面向對象不能很好完成一些額外的功能業務時&#xff0c;可以采用AOP來進行補充。切面編程的目的就是為了將業務目標進行而外的增強或者擴展。Spring中的AOP是基于JDK動態代理和CGLIB動態代理實現的。 應用場景 日志操作&…

【數據結構(四)】前綴、中綴、后綴表達式(逆波蘭表達式)和逆波蘭計算器的代碼實現(2)

文章目錄 1. 前綴表達式(波蘭表達式)1.1. 前綴表達式的計算機求值 2. 中綴表達式3. 后綴表達式(逆波蘭表達式)3.1. 后綴表達式的計算機求值3.2. 逆波蘭計算器的實現 4. 中綴表達式 轉 后綴表達式4.1. 思路分析4.2. 代碼實現 5. 逆波蘭計算器的完整版 1. 前綴表達式(波蘭表達式)…

手寫數字可視化_Python數據分析與可視化

手寫數字可視化 手寫數字流形學習 手寫數字 手寫數字無論是在數據可視化還是深度學習都是一個比較實用的案例。 數據在sklearn中&#xff0c;包含近2000份8 x 8的手寫數字縮略圖。 首先需要先下載數據&#xff0c;然后使用plt.imshow()對一些圖形進行可視化&#xff1a; 打開c…

Mysql 鎖機制分析

整體業務代碼精簡邏輯如下&#xff1a; Transaction public void service(Integer id) {delete(id);insert(id); }數據庫實例監控&#xff1a; 當時通過分析上游問題流量限流解決后&#xff0c;后續找時間又重新分析了下問題發生的根本原因&#xff0c;現將其總結如下&#xf…

XDR 網絡安全:技術和最佳實踐

擴展檢測和響應&#xff08;XDR&#xff09;是一種安全方法&#xff0c;它將多種保護工具集成到一個統一的集成解決方案中。它為組織提供了跨網絡、端點、云工作負載和用戶的廣泛可見性&#xff0c;從而實現更快的威脅檢測和響應。 XDR的目標是提高威脅檢測的速度和準確性&…

Arduino驅動防水型SHT20溫濕傳感器(溫濕度傳感器)

目錄 1、傳感器特性 2、控制器和傳感器連線圖 3、驅動程序 SHT20防水型溫濕傳感器,采用新一代Sensirion濕度和溫度傳感器,配有4代CMOSens芯片。除了配有電容式相對濕度傳感器和能隙溫度傳感器外,該芯片還包含一個放大器、A/D轉換器、OTP內存和數字處理單元,可精確測量周…

Linux系統介紹及文件類型和權限

終端:CtrlAltT 或者桌面/文件夾右鍵,打開終端 切換為管理員:sudo su 退出:exit 查看內核版本號:uname -a 內核版本號含義:5 代表主版本號;13代表次版本號;0代表修訂版本號;30代表修訂版本的第幾次微調;數字越大表示內核越新. 目錄結構 /bin:存放常用命令(即二進制可執行程序…

C/C++內存管理(2):`new`和`delete`的實現原理

new和delete操作自定義類型 class Stack { public:Stack(int capacity 3):_top(0), _capacity(capacity){cout << "Stack(int capacity 3)" << endl;_a new int[capacity];}~Stack(){cout << "~Stack()" << endl;delete _a;_to…

openssl+ RSA + linux 簽名開發實例(C++)

文章目錄 一、opensslRSA理論基礎二、openssl RSA 簽名開發實例 一、opensslRSA理論基礎 RSA簽名是一種非對稱加密算法&#xff0c;用于在信息傳輸過程中驗證消息的完整性和真實性。以下是RSA簽名的理論基礎的主要知識點&#xff1a; RSA密鑰對&#xff1a; RSA使用一對公鑰和…

pcie-2-rj45速度優化

背景: 目前用iperf3打流傳輸速率達不到要求,千兆實際要求跑到800M以上: 優化方案: 1.優化defconfig: 首先編譯user版本驗證看是否正常 debug版本關閉CONFIG_SLUB_DEBUG_ON宏控。 2.找FAE ,通過更換驅動,或者更新驅動來優化 3.綁定大核: 以8125網卡為例,udp…

【Unity】IBeginDragHandler、IDragHandler 和 IEndDragHandler 介紹

IBeginDragHandler、IDragHandler 和 IEndDragHandler 介紹 IBeginDragHandler、IDragHandler 和 IEndDragHandler 是 Unity 引擎中的三個接口&#xff0c;用于處理 UI 元素的拖放事件。這些接口通常結合使用&#xff0c;構成了 Unity 引擎的拖放事件系統。 IBeginDragHandler…

java--權限修飾符

1.什么是權限修飾符 就是是用來限制類中的成員(成員變量、成員方法、構造器、代碼塊...)能夠被訪問的范圍。 2.權限修飾符有幾種&#xff1f;各自的作用是什么&#xff1f; private<缺省<protected<public(范圍由小到大)

什么年代了,還不會 CI/CD 么?

目錄 什么是 CI/CD&#xff1f; CI/CD 對業務有哪些好處&#xff1f; 一&#xff1a;確保卓越的代碼質量 二&#xff1a;更快的發布速度 → 更快的交付 三&#xff1a;自動化降低成本 四&#xff1a;故障隔離 五&#xff1a;簡化回滾 六&#xff1a;持續反饋 七&#…

設計模式——行為型模式(二)

6.8 迭代器模式 6.8.1 概述 定義:提供一個對象來順序訪問聚合對象中的一系列數據,而不暴露聚合對象的內部表示。 6.8.2 結構 迭代器模式主要包含以下角色: 抽象聚合(Aggregate)角色:定義存儲、添加、刪除聚合元素以及創建迭代器對象的接口。具體聚合(ConcreteAggreg…

C# Onnx PP-Vehicle 車輛分析(包含:車輛檢測,識別車型和車輛顏色)

目錄 效果 模型信息 mot_ppyoloe_s_36e_ppvehicle.onnx vehicle_attribute_model.onnx 項目 代碼 下載 其他 C# Onnx PP-Vehicle 車輛分析&#xff08;包含&#xff1a;車輛檢測&#xff0c;識別車型和車輛顏色&#xff09; 效果 模型信息 mot_ppyoloe_s_36e_ppvehi…

009 OpenCV 二值化 threshold

一、環境 本文使用環境為&#xff1a; Windows10Python 3.9.17opencv-python 4.8.0.74 二、二值化算法 2.1、概述 在機器視覺應用中&#xff0c;OpenCV的二值化函數threshold具有不可忽視的作用。主要的功能是將一幅灰度圖進行二值化處理&#xff0c;以此大幅降低圖像的數…

ASP.NET Core 啟用CORS

瀏覽器的安全阻止一個域的本地頁面請求另外不同域的本地頁面&#xff0c;這個限制叫同源策略&#xff0c;這個安全特性用來阻止惡意站點從別的網站讀取數據 例如假如我有一個頁面叫A.html https://foo.example/A.html 現在頁面A.html有一個ajax代碼嘗試讀取B.html的HTML的源…