Python基礎學習筆記——異常

目錄

  • 一、bug的簡介
  • 二、異常捕獲預處理機制
    • 1. 繼承
    • 2. 捕獲與預處理
    • 3. 嵌套與傳遞

一、bug的簡介

??1947年,世界第一部萬用計算機的進化版——馬克2號Mark II)的程序運行發生了異常,計算機程序之母格蕾絲經調試后,發現是一只飛蛾卡在了繼電器觸點中間,于是她把蟲子的尸體
粘在了自己的工作日記上,稱它們為臭蟲bug)。

??從此以后,計算機程序或硬件系統中存在的錯誤、故障、缺陷或漏洞,統稱為bug。調試程序的步驟,也稱為debug

??當bug導致程序跳出運行時,系統會報出對應的異常類型Python中常見的異常有:語法格式錯誤SyntaxError值類型錯誤ValueError空索引錯誤IndexError空鍵錯誤KeyError未聲明錯誤NameError未分配錯誤AttributeError除零錯誤ZeroDivisionError,……


二、異常捕獲預處理機制

1. 繼承

??Python中,異常也是對象,所有內置的異常類都是從BaseException繼承,且都在內建模塊builtins中定義。在捕獲異常時,匹配的是其對應的異常類及其父類。繼承層次如下:

BaseException  # 所有異常的基類+-- SystemExit  		# 解釋器請求退出+-- KeyboardInterrupt  # 用戶中斷執行(Ctrl+C)+-- GeneratorExit  	# 生成器異常退出+-- Exception  		# 常規異常的基類+-- StopIteration  		# 迭代器沒有更多的值+-- StopAsyncIteration  	# 必須通過異步迭代器對象的__anext__()方法引發以停止迭代+-- ArithmeticError  		# 算術錯誤異常的基類|    +-- FloatingPointError  	# 浮點計算錯誤|    +-- OverflowError  		# 溢位錯誤(數值太大)|    +-- ZeroDivisionError  	# 除(模)零 +-- AssertionError  	# 斷言失敗+-- AttributeError  	# 屬性/方法的引用或賦值失敗+-- BufferError  		# 緩沖區錯誤+-- EOFError  		# 當input()函數在未讀取任何數據時達到文件結束條件(EOF)時引發+-- ImportError  		# 導入模塊/對象失敗|    +-- ModuleNotFoundError  # 尋找模塊失敗+-- LookupError  	# 無效鍵/索引時的基類|    +-- IndexError  	# 序列無此索引|    +-- KeyError  	# 映射無此鍵+-- MemoryError  	# 內存溢出錯誤+-- NameError  	# 對象未聲明/初始化 |    +-- UnboundLocalError  	# 本地變量未初始化+-- OSError  		# 操作系統錯誤|    +-- BlockingIOError  	# 操作將阻塞對象(e.g.socket)設置為非阻塞操作|    +-- ChildProcessError  	# 子進程操作失敗|    +-- ConnectionError  	# 連接異常的基類|    |    +-- BrokenPipeError  		# 在已關閉的管道寫入|    |    +-- ConnectionAbortedError  # 連接嘗試被對等方中止|    |    +-- ConnectionRefusedError  # 連接嘗試被對等方拒絕|    |    +-- ConnectionResetError    # 連接由對等方重置|    +-- FileExistsError  	# 創建已存在的文件或目錄|    +-- FileNotFoundError  	# 請求不存在的文件或目錄|    +-- InterruptedError  	# 系統調用被輸入信號中斷|    +-- IsADirectoryError  	# 在目錄上請求文件操作(e.g.os.remove())|    +-- NotADirectoryError  	# 在非目錄對象上請求目錄操作(e.g.os.listdir())|    +-- PermissionError  	# 操作權限不足|    +-- ProcessLookupError  	# 給定進程不存在|    +-- TimeoutError  		# 系統函數在系統級別超時+-- ReferenceError  	# weakref.proxy()函數創建的弱引用試圖訪問已經垃圾回收了的對象+-- RuntimeError  	# 未定義類錯誤|    +-- NotImplementedError  # 在用戶定義的基類中,抽象方法要求派生類重寫該方法或者正在開發的類指示仍需添加實際實現|    +-- RecursionError  		# 超出最大遞歸深度+-- SyntaxError  	# 語法格式錯誤|    +-- IndentationError 	# 縮進錯誤|         +-- TabError  # Tab和空格混用+-- SystemError  	# 解釋器內部錯誤+-- TypeError  	# 操作或函數應用于不適當類型的對象+-- ValueError  	# 操作或函數接收到具有正確類型但值不合適的參數|    +-- UnicodeError   # Unicode錯誤|         +-- UnicodeDecodeError  	# Unicode解碼錯誤|         +-- UnicodeEncodeError  	# Unicode編碼錯誤|         +-- UnicodeTranslateError  	# Unicode轉碼錯誤+-- Warning  		# 警告的基類+-- DeprecationWarning  			# 已棄用功能警告+-- PendingDeprecationWarning  	# 不推薦使用功能警告+-- RuntimeWarning  				# 可疑行為警告+-- SyntaxWarning  				# 可疑語法警告+-- UserWarning  				# 用戶代碼生成警告+-- FutureWarning  				# 可能錯誤警告+-- ImportWarning  				# 模塊導入警告+-- UnicodeWarning  				# Unicode警告+-- BytesWarning  				# 與bytes和bytearray相關的警告+-- ResourceWarning  			# 資源使用警告(被默認警告過濾器忽略)

?

2. 捕獲與預處理

??try...except...語句用于捕獲并處理異常,其機制為:

??try下的代碼塊運行時,如果發生異常,不跳出程序從上到下依次檢索except子句,并執行第一個匹配該異常的except子句。

try:n = 1/0		# 發生錯誤,轉到except語句print(n)	# 不執行
except SyntaxError or ValueError:	# 異常類型錯誤print('Error')					# 不執行
except ZeroDivisionError:			# 異常類型正確print('ZeroDivisionError')		# 打印錯誤

??若需要對其他所有錯誤有統一的應對行為,可不設置異常類型,或者將except子句匹配的異常類型設為BaseException。此外,也可以通過as將匹配的異常賦給變量,以便于查詢異常發生的具體原因,并防止 “異常字句過于寬泛” 的警告。

try:n = mprint(n)
# 一般是最后一個
except BaseException as E:	# except:(必須是最后一個)print(E)				# name 'm' is not defined

?

3. 嵌套與傳遞

??try塊可以在許多結構中嵌套,包括自身、循環結構函數體等等。在多層嵌套中,異常的傳遞機制為:
??若異常未被內層except子句捕獲,則將被遞交到外層try塊,直至異常被處理。如果都不處理該異常,就終止其所在線程。

??在此基礎上,還有追加子句elsefinally。當沒有匹配except子句時,異常就會由else子句捕獲,并執行else子塊。而不論try塊中是否發生異常,finally子句最終都會被執行,并釋放本層try塊的資源

# 載入精確計算庫
from decimal import Decimal
# 初始化循環條件
flag = 1while flag:# 運算器主體try:# 功能說明print('保留三位小數的除法運算器'.center(20))# 輸入參數n = input('被除數:')m = input('除數:')# 計算結果result = '商:{:.3f}'.format(float(Decimal(n) / Decimal(m)))# 除零錯誤except ZeroDivisionError:print('division by zero')# 輸入類型錯誤except ArithmeticError:print('invalid operand type(s)')# 無異常,輸出結果else:print(result)# 循環控制finally:try:flag = int(input('輸入1繼續,輸入0退出:'))except BaseException:flag = 0

??以上實例代碼實現了一個保留三位小數的除法運算器。其中,finally子句中嵌套了一個內層try塊。另外,由于調用了第三方庫,大部分發生的相似錯誤并不屬于常規異常子類,可以考慮向其父類追溯

??特別的,循環結構函數體中的內層try塊中的finally子句里,若含有breakreturn語句,那么異常不再發生傳遞,并且其所在進程將被終止。

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

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

相關文章

C#實用的工具類庫

Masuit.Tools Masuit.Tools大都是靜態類,加密解密,反射操作,樹結構,文件探測,權重隨機篩選算法,分布式短id,表達式樹,linq擴展,文件壓縮,多線程下載&#xf…

非線性系列(三)—— 非線性求解器算法分類

1. 總體認知 CAE中的非線性方程組求解主要依賴牛頓法(及牛頓法的變體),步驟如下 以線搜索方法為例,流程如下: 2. 方法分類 適用范圍大類小類描述牛頓法雅可比矩陣難獲取擬牛頓法 Broyden(Secant method)、…

DP(1) | Java | LeetCode 509, 70, 746 做題總結

509. 斐波那契數 https://leetcode.cn/problems/fibonacci-number/ 確定dp數組(dp table)以及下標的含義 dp[i] 第i個斐波那契數值為dp[i] 確定遞推公式 題目說了 F(n) F(n - 1) F(n - 2)dp數組如何初始化 題目說了 F(0) 0,F(1) 1確定遍歷…

15. Revit API: Transaction(事務)與 Failures(故障處理)

前言 UI講完,回到DB這塊兒。在Document那篇,提到增刪改查操作都是在Document上,是對Documet進行操作。 看到“增刪改查”這四個,想到什么了沒有? 數據庫(DB)嘛~話說那本經典的紅皮數據庫的書叫…

網絡安全----防御----防火墻安全策略組網

防火墻組網 要求: 1,DMz區內的服務器,辦公區僅能在辦公時間內(9:00-18:00)可以訪問,生產區的設備全天可以訪問。 2,生產區不允許訪問互聯網,辦公區和游客區允許訪問互聯網 3,辦公區設備10.0.…

計算機網絡之廣域網

廣域網特點: 主要提供面向通信的服務,支持用戶使用計算機進行遠距離的信息交換。 覆蓋范圍廣,通信的距離遠,需要考慮的因素增多, 線路的冗余、媒體帶寬的利用和差錯處理問題。 由電信部門或公司負責組建、管理和維護,并向全社會…

友思特方案 | 低延遲GigE Vision解決方案:用于紅外設備、醫療和工業級探測面板

導讀 維持實時視頻系統軟硬件的長期成本效益,是該系統在醫療、工業等領域廣泛應用的前提。友思特低延遲GigE Vision解決方案創新性地突破了這一難題,提供高帶寬且高可靠性的端到端網絡鏈接,有效降低了開發成本、復雜性和時間。 引言 雖然實…

DDoS攻擊詳解

DDoS 攻擊,其本質是通過操控大量的傀儡主機或者被其掌控的網絡設備,向目標系統如潮水般地發送海量的請求或數據。這種行為的目的在于竭盡全力地耗盡目標系統的網絡帶寬、系統資源以及服務能力,從而致使目標系統無法正常地為合法用戶提供其所應…

leetcode--從前序與中序遍歷序列構造二叉樹

leetcode地址:從前序與中序遍歷序列構造二叉樹 給定兩個整數數組 preorder 和 inorder ,其中 preorder 是二叉樹的先序遍歷, inorder 是同一棵樹的中序遍歷,請構造二叉樹并返回其根節點。 示例 1: 輸入: preorder [3,9,20,15,…

vue學習day05-watch偵聽器(監視器)、Vue生命周期和生命周期的四個階段、、工程化開發和腳手架Vue cli

13、watch偵聽器(監視器) (1)作用:監視數據變化,執行一些業務邏輯或異步操作 (2)語法: 1)簡寫語法——簡單數據類型,直接監視 ① Watch:{ 數…

[Flink]二、Flink1.13

7. 處理函數 之前所介紹的流處理 API,無論是基本的轉換、聚合,還是更為復雜的窗口操作,其實都是基于 DataStream 進行轉換的;所以可以統稱為 DataStream API ,這也是 Flink 編程的核心。而我們知道,為了讓代碼有更強大的表現力和易用性, Flink 本身提供了多…

一文入門【NestJs】Controllers 控制器

Nest學習系列 ??一文帶你入門【NestJS】 ??前言 流程圖 Controllers 控制器主要負責處理傳入請求,并向客戶端返回響應,控制器可以通過路由機制來控制接收那些請求,通常一個Controllers種會有多個匹配路由,不同的路由可以知…

Spring源碼二十一:Bean實例化流程四

上一篇Spring源碼二十:Bean實例化流程三中,我們主要討論了單例Bean創建對象的主要方法getSingleton的內部方法createBean,createBean方法中的resolveBeanClase方法與prepareMethodOverrides方法處理了lookup-method屬性與repliace-method配置…

MT3046 憤怒的象棚

思路: a[]存憤怒值;b[i]存以i結尾的,窗口里的最大值;c[i]存以i結尾的,窗口里面包含?的最大值。 (?為新大象的位置) 例:1 2 3 4 ? 5 6 7 8 9 則ans的計算公式b3b4c4c5c6b7b8b9…

三代測序結構變異分析 - 單樣本Germline SV calling和多樣本SV Calling

適用于三代PacBio HiFi / ONT 長reads數據的結構變異分析。 1. sniffles2安裝 sniffles2需要Python >= 3.10環境,因此用conda創建安裝好3.10的環境。 sniffles2安裝要求: Python >= 3.10pysam >= 0.21.0edlib >=1.3.9psutil>=5.9.4# 創建conda環境 conda c…

【記錄】LaTex|LaTex 代碼片段 Listings 添加帶圓圈數字標號的箭頭(又名 LaTex Tikz 庫畫箭頭的簡要介紹)

文章目錄 前言注意事項1 Tikz 的調用方法:newcommand2 標號圓圈數字的添加方式:\large{\textcircled{\small{1}}}\normalsize3 快速掌握 Tikz 箭頭寫法:插入點相對位移標號node3.1 第一張圖:插入點相對位移3.2 第二張圖&#xff1…

【MindSpore學習打卡】應用實踐-LLM原理和實踐-基于MindSpore實現BERT對話情緒識別

在當今的自然語言處理(NLP)領域,情緒識別是一個非常重要的應用場景。無論是在智能客服、社交媒體分析,還是在情感計算領域,準確地識別用戶的情緒都能夠極大地提升用戶體驗和系統的智能化水平。BERT(Bidirec…

imx6ull/linux應用編程學習(12)CAN應用編程基礎

關于裸機的can通信,會在其他文章發,這里主要講講linux上的can通信。 與I2C,SPI等同步通訊方式不同,CAN通訊是異步通訊,也就是沒有時鐘信號線來保持信號接收同步,也就是所說的半雙工,無法同時發送與接收&…

【Java 注解,自定義注解,元注解,注解本質,注解解析】

文章目錄 什么是注解?Java內置注解自定義注解元注解注解的本質注解解析 什么是注解? 注解是Java編程語言中的一種元數據,提供了有關程序的額外信息。注解以符號開始,緊跟著注解的名稱和一對括號,括號內包含注解的參數…

C++基礎篇(1)

目錄 前言 1.第一個C程序 2.命名空間 2.1概念理解 2.2namespace 的價值 2.3 namespace的定義 3.命名空間的使用 4.C的輸入輸出 結束語 前言 本節我們將正式進入C基礎的學習,話不多說,直接上貨!!! 1.第一個C程…