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

Python異常類型的使用及說明

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

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

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

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

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

所有Python的內(nèi)置異常都繼承自 BaseException 類。這個層次結(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īng)該捕獲 Exception 或其子類,而不是 BaseException。因為 SystemExitKeyboardInterrupt 不被認為是程序“錯誤”,捕獲它們會阻止程序正常退出或響應(yīng)用戶中斷(Ctrl+C)。

二、主要異常類型詳解

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

類別1:最常見的運行時錯誤

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

ValueError

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

TypeError

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

NameError

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

IndexError

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

KeyError

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

AttributeError

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

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

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

NotImplementedError (繼承自 RuntimeError)

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

示例

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

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

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

AssertionError

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

示例

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

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

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

OSError

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

它的重要子類包括

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

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

ArithmeticError

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

子類包括

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

ImportError

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

類別5:語法錯誤(特殊情況)

SyntaxError

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

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

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

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

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

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

# 2. 創(chuàng)建更具體的異常類
class APIResponseError(MyAppError):
    """當(dāng)API返回一個意外的或錯誤的響應(yīng)時引發(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}")
    # 模擬一個失敗的響應(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)置異常 來表示通用的編程錯誤(如 ValueError, TypeError)。

使用 NotImplementedError 來定義接口和抽象方法,強制子類實現(xiàn)。

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

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

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

相關(guān)文章

  • Python爬取視頻時長場景實踐示例

    Python爬取視頻時長場景實踐示例

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

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

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

    Python3 filecmp模塊測試比較文件原理解析

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

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

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

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

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

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

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

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

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

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

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

    讓文件路徑提取變得更簡單的Python Path庫

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

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

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

最新評論

陆川县| 治县。| 怀仁县| 青浦区| 叙永县| 瑞金市| 徐闻县| 苗栗县| 泰兴市| 南部县| 柯坪县| 浮山县| 平江县| 犍为县| 澎湖县| 石楼县| 保德县| 富锦市| 兖州市| 安岳县| 澄城县| 平安县| 花莲县| 定日县| 德江县| 潮州市| 韶山市| 安阳县| 建阳市| 太湖县| 丰镇市| 伊吾县| 台中县| 丰顺县| 龙井市| 尚志市| 那曲县| 会东县| 大安市| 山阳县| 珲春市|