最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python異常類型的使用及說(shuō)明

 更新時(shí)間:2025年07月18日 09:15:49   作者:Tipriest_  
Python異常類型豐富且層次分明,涵蓋運(yùn)行時(shí)錯(cuò)誤、設(shè)計(jì)意圖異常、外部交互錯(cuò)誤等,合理使用內(nèi)置異常及自定義異常能提升代碼健壯性與可維護(hù)性

在Python中,我們可以 raise 的 Error(更準(zhǔn)確地說(shuō)是 Exception,異常)類型非常豐富,它們構(gòu)成了一個(gè)清晰的類層次結(jié)構(gòu)。了解這些類型及其用途,對(duì)于編寫(xiě)健壯、可讀性強(qiáng)的代碼至關(guān)重要。

NotImplementedError 是一個(gè)非常好的例子,它代表了一種特定的“設(shè)計(jì)意圖”,而不僅僅是運(yùn)行時(shí)錯(cuò)誤。

下面我將為您詳細(xì)介紹Python中可以 raise 的主要異常類型,并按照它們的邏輯關(guān)系和用途進(jìn)行分類。

一、異常的基本層次結(jié)構(gòu)

所有Python的內(nèi)置異常都繼承自 BaseException 類。這個(gè)層次結(jié)構(gòu)非常重要:

BaseException
 ├── SystemExit
 ├── KeyboardInterrupt
 └── Exception  <-- 絕大多數(shù)異常都繼承自這里
      ├── StopIteration
      ├── ArithmeticError
      │    ├── ZeroDivisionError
      │    └── OverflowError
      ├── AssertionError
      ├── AttributeError
      ├── ImportError
      │    └── ModuleNotFoundError
      ├── LookupError
      │    ├── IndexError
      │    └── KeyError
      ├── NameError
      ├── OSError
      │    ├── FileNotFoundError
      │    └── PermissionError
      ├── RuntimeError
      │    └── NotImplementedError  <-- 你提到的在這里
      ├── TypeError
      ├── ValueError
      └── ...等等

一條黃金法則:

在你的 try...except 語(yǔ)句中,通常應(yīng)該捕獲 Exception 或其子類,而不是 BaseException。因?yàn)?SystemExitKeyboardInterrupt 不被認(rèn)為是程序“錯(cuò)誤”,捕獲它們會(huì)阻止程序正常退出或響應(yīng)用戶中斷(Ctrl+C)。

二、主要異常類型詳解

我將它們分為幾類,以便更好地理解它們的用途。

類別1:最常見(jiàn)的運(yùn)行時(shí)錯(cuò)誤

這些是你在日常編程中遇到最多的錯(cuò)誤。

ValueError

  • 何時(shí)使用:當(dāng)一個(gè)函數(shù)的參數(shù)類型正確,但其不合適時(shí)。
  • 示例int('abc')。字符串 'abc' 是一個(gè) str 類型,int() 可以接受 str,但 'abc' 這個(gè)值無(wú)法被轉(zhuǎn)換成整數(shù)。

TypeError

  • 何時(shí)使用:當(dāng)對(duì)一個(gè)對(duì)象執(zhí)行了其類型不支持的操作時(shí)。
  • 示例'hello' + 5。你不能將一個(gè)字符串和一個(gè)整數(shù)相加。

NameError

  • 何時(shí)使用:當(dāng)嘗試使用一個(gè)未被定義的變量名時(shí)。
  • 示例print(my_undefined_variable)。

IndexError

  • 何時(shí)使用:當(dāng)試圖訪問(wèn)序列(如列表、元組)中一個(gè)不存在的索引時(shí)。
  • 示例my_list = [1, 2, 3]; print(my_list[5])。

KeyError

  • 何時(shí)使用:當(dāng)試圖訪問(wèn)字典中一個(gè)不存在的鍵時(shí)。
  • 示例my_dict = {'a': 1}; print(my_dict['b'])

AttributeError

  • 何時(shí)使用:當(dāng)試圖訪問(wèn)或賦值一個(gè)對(duì)象不存在的屬性或方法時(shí)。
  • 示例my_int = 5; my_int.append(6)。整數(shù)沒(méi)有 append 方法。

類別2:用于程序設(shè)計(jì)和邏輯控制的異常

這類異常通常由程序員主動(dòng) raise,以表明某種設(shè)計(jì)上的約定或狀態(tài)。

NotImplementedError (繼承自 RuntimeError)

  • 何時(shí)使用:在父類(尤其是抽象基類)中定義一個(gè)方法,并強(qiáng)制要求所有子類必須重寫(xiě)(實(shí)現(xiàn))這個(gè)方法。它清楚地告訴其他開(kāi)發(fā)者:“這個(gè)功能需要你自己去實(shí)現(xiàn)”。

示例

class Shape:
    def get_area(self):
        # 任何繼承自Shape的子類都必須實(shí)現(xiàn)自己的get_area方法
        raise NotImplementedError("Subclasses must implement this method!")

class Square(Shape):
    def __init__(self, side):
        self.side = side
    
    # 如果不寫(xiě)下面的方法,調(diào)用 get_area() 就會(huì)報(bào)錯(cuò)
    def get_area(self):
        return self.side ** 2

# s = Shape()
# s.get_area()  # 這會(huì)立即引發(fā) NotImplementedError
sq = Square(5)
print(sq.get_area()) # 輸出 25

AssertionError

  • 何時(shí)使用:當(dāng) assert 語(yǔ)句的條件為 False 時(shí)被觸發(fā)。它主要用于內(nèi)部自檢和調(diào)試,檢查程序在某個(gè)點(diǎn)的狀態(tài)是否符合預(yù)期。它不應(yīng)該用于驗(yàn)證用戶輸入。

示例

def process_data(data):
    assert isinstance(data, list), "Input data must be a list"
    # ... 后續(xù)處理 ...

process_data("not a list") # 引發(fā) AssertionError: Input data must be a list

RuntimeError

  • 何時(shí)使用:當(dāng)發(fā)生一個(gè)不屬于任何其他明確類別的錯(cuò)誤時(shí)。它是一個(gè)比較通用的錯(cuò)誤,通常表示發(fā)生了某些意想不到的外部事件。NotImplementedError 就是它的一個(gè)子類。

類別3:與外部環(huán)境交互的錯(cuò)誤

OSError

  • 何時(shí)使用:當(dāng)發(fā)生系統(tǒng)相關(guān)的錯(cuò)誤時(shí),例如I/O操作失敗。它是一個(gè)廣泛的基類。

它的重要子類包括

  • FileNotFoundError: 試圖打開(kāi)一個(gè)不存在的文件。open('non_existent_file.txt')。
  • PermissionError: 試圖以沒(méi)有權(quán)限的方式讀寫(xiě)文件。例如,試圖寫(xiě)入一個(gè)只讀文件。
  • ConnectionError: 與網(wǎng)絡(luò)連接相關(guān)的問(wèn)題,如連接被拒絕 (ConnectionRefusedError)。
  • TimeoutError: 一個(gè)操作在指定時(shí)間內(nèi)未能完成。

類別4:算術(shù)和導(dǎo)入錯(cuò)誤

ArithmeticError

  • 何時(shí)使用:所有數(shù)值計(jì)算錯(cuò)誤的基類。

子類包括

  • ZeroDivisionError: 除以零。1 / 0
  • OverflowError: 計(jì)算結(jié)果超出了數(shù)字類型能表示的最大范圍。import math; math.exp(1000)

ImportError

  • 何時(shí)使用:當(dāng) import 語(yǔ)句無(wú)法找到或加載模塊時(shí)。
  • ModuleNotFoundError (自 Python 3.6 起):是 ImportError 的一個(gè)子類,更明確地表示模塊本身未找到。
  • 示例import some_module_that_does_not_exist。

類別5:語(yǔ)法錯(cuò)誤(特殊情況)

SyntaxError

  • 何時(shí)發(fā)生:這是你在運(yùn)行代碼之前就會(huì)遇到的錯(cuò)誤。Python解釋器在解析代碼時(shí)發(fā)現(xiàn)語(yǔ)法不正確。你不能在 try...except 塊中捕獲它,因?yàn)樗诖a執(zhí)行前就失敗了。
  • IndentationError (子類):最常見(jiàn)的語(yǔ)法錯(cuò)誤之一,代碼縮進(jìn)不正確。

三、創(chuàng)建你自己的自定義異常

當(dāng)內(nèi)置的異常類型無(wú)法精確描述你的應(yīng)用程序特有的錯(cuò)誤時(shí),最佳實(shí)踐是創(chuàng)建自己的異常類。這能讓你的代碼更具可讀性和可維護(hù)性。

自定義異常應(yīng)該繼承自 Exception 或其某個(gè)合適的子類。

示例:假設(shè)你在開(kāi)發(fā)一個(gè)與外部API交互的應(yīng)用。

# 1. 創(chuàng)建一個(gè)基礎(chǔ)的自定義異常類
class MyAppError(Exception):
    """應(yīng)用程序所有自定義異常的基類。"""
    pass

# 2. 創(chuàng)建更具體的異常類
class APIResponseError(MyAppError):
    """當(dāng)API返回一個(gè)意外的或錯(cuò)誤的響應(yīng)時(shí)引發(fā)。"""
    def __init__(self, message, status_code):
        super().__init__(message)
        self.status_code = status_code

# 3. 在代碼中使用它
def get_user_data(user_id):
    # response = requests.get(f"https://api.example.com/users/{user_id}")
    # 模擬一個(gè)失敗的響應(yīng)
    status_code = 500
    if status_code != 200:
        raise APIResponseError(f"Failed to fetch data, API returned {status_code}", status_code)
    # return response.json()

# 4. 捕獲它
try:
    get_user_data(123)
except APIResponseError as e:
    print(f"Error communicating with API: {e}")
    print(f"Status code was: {e.status_code}")
except MyAppError as e:
    print(f"An application-specific error occurred: {e}")

總結(jié)

使用 內(nèi)置異常 來(lái)表示通用的編程錯(cuò)誤(如 ValueError, TypeError)。

使用 NotImplementedError 來(lái)定義接口和抽象方法,強(qiáng)制子類實(shí)現(xiàn)。

使用 AssertionError 進(jìn)行內(nèi)部調(diào)試和狀態(tài)檢查。

當(dāng)內(nèi)置異常不足以描述你的特定問(wèn)題域時(shí),創(chuàng)建自定義異常,以提高代碼的清晰度和健壯性。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python爬取視頻時(shí)長(zhǎng)場(chǎng)景實(shí)踐示例

    Python爬取視頻時(shí)長(zhǎng)場(chǎng)景實(shí)踐示例

    這篇文章主要為大家介紹了Python獲取視頻時(shí)長(zhǎng)場(chǎng)景實(shí)踐示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Python with關(guān)鍵字,上下文管理器,@contextmanager文件操作示例

    Python with關(guān)鍵字,上下文管理器,@contextmanager文件操作示例

    這篇文章主要介紹了Python with關(guān)鍵字,上下文管理器,@contextmanager文件操作,結(jié)合實(shí)例形式分析了Python使用with關(guān)鍵字及上下文管理器、contextmanager進(jìn)行文件打開(kāi)、讀寫(xiě)、關(guān)閉等操作的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-10-10
  • Python3 filecmp模塊測(cè)試比較文件原理解析

    Python3 filecmp模塊測(cè)試比較文件原理解析

    這篇文章主要介紹了Python3 filecmp模塊測(cè)試比較文件原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 詳解OpenCV和PIL讀取和顯示圖像的差異

    詳解OpenCV和PIL讀取和顯示圖像的差異

    這篇文章主要介紹了OpenCV和PIL讀取和顯示圖像的差異,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Pandas提高數(shù)據(jù)分析效率的13個(gè)技巧匯總

    Pandas提高數(shù)據(jù)分析效率的13個(gè)技巧匯總

    這篇文章主要是為大家歸納整理了13個(gè)工作中常用到的pandas使用技巧,方便更高效地實(shí)現(xiàn)數(shù)據(jù)分析,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-05-05
  • Python+Matplotlib繪制高亮顯示餅圖的示例代碼

    Python+Matplotlib繪制高亮顯示餅圖的示例代碼

    餅圖 (Pie Chart) 是一種圓形統(tǒng)計(jì)圖,被分割成片用于表示數(shù)值間的比例關(guān)系,本文為大家介紹了Matplotlib繪制高亮顯示的餅圖的函數(shù)源碼,需要的可以參考一下
    2023-06-06
  • Python科學(xué)畫(huà)圖代碼分享

    Python科學(xué)畫(huà)圖代碼分享

    這篇文章主要介紹了Python科學(xué)畫(huà)圖代碼分享,涉及matplotlib庫(kù)的簡(jiǎn)單介紹,分享了matplotlib繪圖庫(kù)書(shū)籍的下載地址,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • Python-jenkins模塊之folder相關(guān)操作介紹

    Python-jenkins模塊之folder相關(guān)操作介紹

    這篇文章主要介紹了Python-jenkins模塊之folder相關(guān)操作介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-05-05
  • 讓文件路徑提取變得更簡(jiǎn)單的Python Path庫(kù)

    讓文件路徑提取變得更簡(jiǎn)單的Python Path庫(kù)

    這里我們介紹 Python3 自帶的庫(kù) Path,可以讓我們使用更少的代碼但是與之而來(lái)的是更高的效率,文中有非常詳細(xì)的介紹及代碼示例 ,需要的朋友可以參考下
    2021-05-05
  • 使用Python+ZPL實(shí)現(xiàn)標(biāo)簽打印與中文排版

    使用Python+ZPL實(shí)現(xiàn)標(biāo)簽打印與中文排版

    這篇文章主要介紹了如何使用Python和ZPL(斑馬打印機(jī)腳本語(yǔ)言)來(lái)解決標(biāo)簽打印問(wèn)題,通過(guò)將內(nèi)容先在Python中渲染成圖片,然后轉(zhuǎn)換成ZPL指令,實(shí)現(xiàn)了所見(jiàn)即所得、支持任意字體和無(wú)需配置打印機(jī)等優(yōu)勢(shì),需要的朋友可以參考下
    2026-02-02

最新評(píng)論

天峻县| 宣汉县| 松滋市| 延安市| 巴东县| 广平县| 海城市| 连州市| 双鸭山市| 汝州市| 南岸区| 无极县| 汨罗市| 右玉县| 松桃| 三亚市| 家居| 桂东县| 满城县| 长垣县| 宜章县| 古田县| 巴塘县| 武强县| 淮北市| 临湘市| 舞阳县| 仪陇县| 和政县| 台北县| 抚宁县| 梧州市| 昆明市| 弥勒县| 乌鲁木齐市| 沙坪坝区| 青田县| 济阳县| 策勒县| 儋州市| 万安县|