Python 基礎(十四): 錯誤和異常

目錄
    • 1 錯誤
    • 2 異常
      • 2.1 內置異常
      • 2.2 異常處理
      • 2.3 拋出異常
      • 2.4 自定義異常

程序中的錯誤我們通常稱為 bug ,工作中我們不僅需要改自己程序中的 bug ,還需要改別人程序中的 bug ,新項目有 bug 要改,老項目也有 bug 要改,可以說 bug 幾乎貫穿一個程序員的職業生涯…
我們通常將 bug 分為 Error(錯誤) 和 Exception(異常),我們下面來具體學習下 Python 中的 錯誤 和 異常。

1 錯誤

錯誤 通常是指程序中的 語法錯誤 或 邏輯錯誤,來通過兩個 Python 例子看一下:

語法錯誤示例

# print前面少了 : 
if Trueprint("hello python")

我們編寫程序通常使用開發工具編寫,比如:我使用 Pycharm 工具編寫 Python 程序,像這種語法錯誤,在編寫程序時,編譯器就會檢測出來并提示我們,因此,我們編寫好的程序幾乎不會出現這種問題。

邏輯錯誤示例

# 0 是不能作為被除數的
a  = 5
b = 0
print(a/b)#執行結果:ZeroDivisionError: division by zero

邏輯錯誤編譯器是不會提示我們的,因此,我們編寫程序時,對一些基本常識要有一定了解,從而,避免出現邏輯錯誤。

2 異常

即便 Python 程序的語法是正確的,在運行它的時候,也有可能發生錯誤,運行期檢測到的錯誤被稱為異常;大多數的異常都不會被程序處理,都以錯誤信息的形式展現。

2.1 內置異常

我們先來看一下異常層次結構:

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

通過上面的異常層次結構,我們可以清晰的看出,BaseException為所有異常的基類,其下面分為:SystemExit、KeyboardInterrupt、GeneratorExit、Exception 四類異常,Exception 為所有非系統退出類異常的基類,Python 提倡繼承 Exception 或其子類派生新的異常;Exception 下包含我們常見的多種異常如:MemoryError(內存溢出)、BlockingIOError(IO異常)、SyntaxError(語法錯誤異常)… 詳細說明可以查看下面列表:

異常名稱描述
BaseException所有異常的基類
SystemExit解釋器請求退出
KeyboardInterrupt用戶中斷執行(通常是輸入^C)
Exception常規錯誤的基類
StopIteration迭代器沒有更多的值
GeneratorExit生成器(generator)發生異常來通知退出
StandardError所有的內建標準異常的基類
ArithmeticError所有數值計算錯誤的基類
FloatingPointError浮點計算錯誤
OverflowError數值運算超出最大限制
ZeroDivisionError除(或取模)零 (所有數據類型)
AssertionError斷言語句失敗
AttributeError對象沒有這個屬性
EOFError沒有內建輸入,到達EOF 標記
EnvironmentError操作系統錯誤的基類
IOError輸入/輸出操作失敗
OSError操作系統錯誤
WindowsError系統調用失敗
ImportError導入模塊/對象失敗
LookupError無效數據查詢的基類
IndexError序列中沒有此索引(index)
KeyError映射中沒有這個鍵
MemoryError內存溢出錯誤(對于Python 解釋器不是致命的)
NameError未聲明/初始化對象 (沒有屬性)
UnboundLocalError訪問未初始化的本地變量
ReferenceError弱引用(Weak reference)試圖訪問已經垃圾回收了的對象
RuntimeError一般的運行時錯誤
NotImplementedError尚未實現的方法
SyntaxErrorPython 語法錯誤
IndentationError縮進錯誤
TabErrorTab 和空格混用
SystemError一般的解釋器系統錯誤
TypeError對類型無效的操作
ValueError傳入無效的參數
UnicodeErrorUnicode 相關的錯誤
UnicodeDecodeErrorUnicode 解碼時的錯誤
UnicodeEncodeErrorUnicode 編碼時錯誤
UnicodeTranslateErrorUnicode 轉換時錯誤
Warning警告的基類
DeprecationWarning關于被棄用的特征的警告
FutureWarning關于構造將來語義會有改變的警告
OverflowWarning舊的關于自動提升為長整型(long)的警告
PendingDeprecationWarning關于特性將會被廢棄的警告
RuntimeWarning可疑的運行時行為(runtime behavior)的警告
SyntaxWarning可疑的語法的警告
UserWarning用戶代碼生成的警告
2.2 異常處理

Python 程序捕捉異常使用 try/except 語句,先看個例子:

# 1.被除數為 0,未捕獲異常
def getNum(n):return 10 / n
print(getNum(0))
#輸出結果: ZeroDivisionError: division by zero# 2.捕獲異常
def getNum(n):try:return 10 / nexcept IOError:print('Error: IOError argument.')except ZeroDivisionError:print('Error: ZeroDivisionError argument.')
print(getNum(0))
'''
輸出結果:
Error: ZeroDivisionError argument.
None
'''

try 語句的工作方式為:

  • 首先,執行 try 子句 (在 try 和 except 關鍵字之間的部分);

  • 如果沒有異常發生, except 子句 在 try 語句執行完畢后就被忽略了;

  • 如果在 try 子句執行過程中發生了異常,那么該子句其余的部分就會被忽略;

  • 如果異常匹配于 except 關鍵字后面指定的異常類型,就執行對應的except子句,然后繼續執行 try 語句之后的代碼;

  • 如果發生了一個異常,在 except 子句中沒有與之匹配的分支,它就會傳遞到上一級 try 語句中;

  • 如果最終仍找不到對應的處理語句,它就成為一個 未處理異常,終止程序運行,顯示提示信息。

try/except 語句還可以帶有一個 else、finally子句,示例如下:

def getNum(n):try:print('try --> ',10 / n)except ZeroDivisionError:print('except --> Error: ZeroDivisionError argument.')else:print('else -->')finally:print('finally -->')'''
1.調用:getNum(0)
輸出結果:
except --> Error: ZeroDivisionError argument.
finally -->2.調用:getNum(1)
輸出結果:
try -->  10.0
else -->
finally -->
'''

其中,else 子句只能出現在所有 except 子句之后,只有在沒有出現異常時執行;finally 子句放在最后,無論是否出現異常都會執行。

2.3 拋出異常

使用 raise 語句允許強制拋出一個指定的異常,要拋出的異常由 raise 的唯一參數標識,它必需是一個異常實例或異常類(繼承自 Exception 的類),如:

raise NameError('HiThere')
2.4 自定義異常

正常來說,Python 提供的異常類型已經滿足我們的使用了,但是有時候我們有定制性的需求,我們可以自定義異常類,繼承自 Error 或 Exception 類就可以了,看個例子:

# 自定義異常類 MyExc
class MyExc(Exception):  #繼承Exception類def __init__(self, value):self.value = valuedef __str__(self):if self.value == 0:return '被除數不能為0'
# 自定義方法
def getNum(n):try:if n == 0:exc = MyExc(n)print(exc)else:print(10 / n)except:pass
'''
1.調用 getNum(1),輸出結果為:
10.02.調用 getNum(0),輸出結果為:
被除數不能為0
'''

在這個自定義的異常例子中,當參數 n 不為 0 時,則正常,當 n 等于 0,則拋出異常,自定義異常在實際應用中很少用到,了解即可。

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

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

相關文章

OpenCV-Python Tutorial : A Candy from Official Main Page(三)

3.11傅立葉變換3.11.1Fourier Transform in OpenCV-cv.dft、cv.magnitude、cv.idft這兩個函數是圖像頻域處理(如去噪、邊緣增強、紋理分析)的基礎工具。1.cv.dft() —— 離散傅里葉變換功能: 將圖像從空間域(像素強度)…

移動端字體適配

一、移動端圖片適配1、使用 <img> 的 srcset<img src"logo.png"srcset"logo2x.png 2x,logo3x.png 3x"alt"Logo">優點&#xff1a;原生支持&#xff0c;瀏覽器自動選擇最合適的圖片。2、使用媒體查詢切換背景圖.logo {background-ima…

git起步

git官網&#xff1a;https://git-scm.com git使用手冊&#xff1a;https://git-scm.com/book/zh/v2 一、Git 是什么&#xff1f; 1、版本控制 版本控制是一種記錄一個或若干文件內容變化&#xff0c;以便將來查閱特定版本修訂情況的系統。我們經常是用的是保存軟件源代碼的…

SSL與HTTP概述

一、概念1.SSL概念SSL&#xff08;Secure Sockets Layer&#xff09;是一種網絡安全協議&#xff0c;用于在互聯網通信中建立加密鏈接&#xff0c;保護在網絡中傳輸的敏感數據免遭竊取或篡改。2.TLS概念雖然現在更先進的 TLS&#xff08;Transport Layer Security&#xff09; …

前端報錯:“Uncaught SyntaxError: missing ) after argument list

問題描述&#xff1a;前端報錯&#xff1a;“Uncaught SyntaxError: missing ) after argument list在 JavaScript 中遇到“SyntaxError: missing ) after argument list”這個錯誤通常意味著在函數調用或者聲明中&#xff0c;參數列表的括號沒有正確閉合。錯誤代碼&#xff1a…

廣州郵科光纖交換機的應用:網絡世界中的幕后核心

你知道嗎&#xff1f;在我們每天暢游互聯網&#xff0c;發送郵件、看視頻、打游戲時&#xff0c;背后支撐這一切流暢體驗的關鍵設備之一就是光纖交換機。它像一個幕后英雄&#xff0c;默默地確保信息傳輸高效、穩定。那么&#xff0c;究竟郵科光纖交換機有哪些不可或缺的應用領…

C++內存布局、構造函數規則和優化策略解析

一、類對象內存布局深度解析 1.1 核心內存占用規則 ?非靜態成員變量?&#xff1a;每個對象獨立存儲&#xff0c;按聲明順序排列&#xff08;含內存對齊填充&#xff09; 示例&#xff1a;class A{int x; char y;}; → 實際占用8字節&#xff08;413填充&#xff09;4?靜態…

Fastapi框架總覽與核心架構

Fastapi框架總覽與核心架構 FastAPI 是一個基于 Python 的現代 Web 框架&#xff0c;專注于 高性能、高并發 和 開發效率&#xff0c;特別適合構建 異步 API 服務、微服務接口&#xff0c;同時在大模型接口封裝中也廣泛應用。它基于 Starlette&#xff08;異步 Web 框架&#x…

高并發四種IO模型的底層原理

高并發四種IO模型的底層原理 1 IO讀寫的基本原理 為了避免用戶進程直接操作內核&#xff0c;保證內核安全&#xff0c;操作系統將內存&#xff08;虛擬內存&#xff09;劃分為兩部分&#xff1a;一部分是內核空間(Kernel-Space)&#xff0c;另一部分是用戶空間(User-Space)。在…

騰訊云短信實戰:Spring Boot接入YML配置與簽名/模板/發送/統計/狀態/號碼包工具類詳解

下面是一個Spring Boot集成騰訊云短信服務的詳細示例&#xff0c;包含配置和6個工具類&#xff08;簽名、模板、發送、統計、狀態&#xff09;&#xff0c;采用YML配置&#xff1a; 1. 添加Maven依賴 <dependency><groupId>com.tencentcloudapi</groupId>&…

【Java篇】IntelliJ IDEA 安裝與基礎配置指南

序 本篇文章將介紹IDEA 2023 版本。 提高開發人員的生產力。無論您是剛開始接觸編程的新手&#xff0c;還是經驗豐富的開發專家。 一&#xff1a;官網下載安裝包&#xff1a; IDEA下載鏈接 這個版本可以根據自己的需要選擇。 二、安裝方法 雙擊進這個.exe文件 這里要選擇合…

2-Nodejs運行JS代碼

2-Nodejs運行JS代碼 創建一個 js 文件編寫 JS 代碼 要注意的是&#xff0c;在nodejs環境中不能操作瀏覽器 DOM 對象相關的api&#xff0c;在Nodejs 中運行 JS 代碼 按住 shift 鍵&#xff0c;在 js 文件所在文件夾空白處右鍵&#xff0c;選擇 Powershell 窗口執行如下命令&…

vue中使用西瓜播放器xgplayer (封裝)+xgplayer-hls 播放.m3u8格式視頻

1.西瓜播放器官網 http://h5player.bytedance.com/guide/2.安裝 # 最新穩定版 $ npm install xgplayer對于已有項目也可以通過 CDN 引入&#xff0c;代碼如下&#xff1a; <script src"//unpkg.byted-static.com/xgplayer/2.31.2/browser/index.js" type"tex…

2025-07-15通過邊緣線檢測圖像里的主體有沒有出血

本節觀點&#xff1a;一個好的提問就已經解決了問題的90%。 對于問題的描述正確與否決定了解決問題的方法和路徑&#xff0c;所以我們在AI時代必須要學會正確的描述問題和表達問題&#xff0c;否則即使有AI輔助也是很難精準的解決問題。 我的問題&#xff1a; 如何利用代碼從圖…

【Docker基礎】Dockerfile指令速覽:文件與目錄操作指令詳解

目錄 引言 1 ADD&#xff1a;高級文件復制與解壓 1.1 指令簡介 1.2 語法 1.3 功能詳解 1.4 使用場景 1.5 執行流程 1.6 示例 1.7 注意事項 2 WORKDIR&#xff1a;設置工作目錄 2.1 指令簡介 2.2 語法 2.3 使用場景 2.4 創建流程 2.5 示例 2.6 注意事項 3 VOLU…

Python 程序設計講義(2):Python 概述

Python 程序設計講義&#xff08;2&#xff09;&#xff1a;Python 概述 一、Python 語言的發展史 Python 語言誕生于 1990 年。 2002 年 10 月&#xff0c;Python2.0 正式發布。 2008 年 12 月&#xff0c;Python3.0 正式發布。 Python3.0 在語法層面和解釋器內部做了很多重大…

多租戶SaaS系統中設計安全便捷的跨租戶流程共享

四維協同架構??,結合動態授權、加密傳輸、行為審計和智能策略 一、??權限控制體系?? 1. ??動態權限模型? ? 2. ??授權策略實現?? ??RBAC+ABAC混合模型?? 在流程表增加shared_tenants字段存儲授權信息,結合屬性動態校驗: CREATE TABLE workflow_process…

Spring Ioc Bean 到底是什么

Bean 到底是什么&#xff1f; 簡單來說&#xff0c;Spring Bean 就是一個由 Spring IoC 容器負責創建、管理和裝配的 Java 對象。 它不是一種新的技術&#xff0c;它本質上還是一個普普通通的 Java 對象&#xff08;POJO - Plain Old Java Object&#xff09;&#xff0c;但它的…

【PCIe 總線及設備入門學習專欄 5.1.1 -- PCIe PERST# 信號的作用】

文章目錄 PCIe PERSTN#PERST# 信號作用概述簡要定義PERST# 的關鍵功能PERST# 的時序圖示意Synopsys PCIe EP IP 中 PERST# 的作用關鍵信號接口典型復位流程示例代碼(Verilog for Synopsys PCIe)PERST# 使用場景舉例(Synopsys PCIe EP)1. 系統上電初始化2. 熱復位特定設備3.…

使用python的pillow模塊將圖片轉化為灰度圖,獲取值和修改值

使用python的pillow模塊可以將圖片轉化為灰度圖&#xff0c; 可以獲取灰度圖的特定點值&#xff0c;區域值&#xff0c; 修改值并保存到圖片 圖片轉換為灰度圖 from PIL import Image# 打開圖片 image Image.open("d://python//2//1.jpg")gray_image image.convert…