Python 異常處理完全指南

目錄

    • 一、異常處理基礎
      • 1. 基本語法結構
    • 二、常見異常類型
      • 1. 內置異常層次
      • 2. 常見異常示例
    • 三、多重異常處理
      • 1. 合并捕獲
      • 2. 分層處理
    • 四、finally與else子句
      • 1. finally 應用場景
      • 2. else 使用技巧
    • 五、自定義異常
      • 1. 創建異常類
      • 2. 異常繼承體系
    • 六、異常鏈與上下文
      • 1. raise from 語法
      • 2. 異常上下文查看
    • 七、最佳實踐與陷阱
    • 綜合實戰案例


異常處理流程圖

一、異常處理基礎

1. 基本語法結構

try:# 可能引發異常的代碼result = 10 / 0
except ZeroDivisionError:# 處理特定異常print("不能除以零!")
except Exception as e:# 通用異常處理print(f"發生錯誤: {e}")
else:# 無異常時執行print("計算成功")
finally:# 始終執行的清理代碼print("清理資源")
  1. 異常傳播機制
觸發異常
當前代碼有try塊?
匹配except
向調用棧上層傳播
執行對應處理
到達頂層?
程序崩潰

二、常見異常類型

1. 內置異常層次

所有異常類都繼承 BaseException

BaseException├── KeyboardInterrupt├── SystemExit└── Exception├── ArithmeticError│    ├── ZeroDivisionError│    └── FloatingPointError├── LookupError│    ├── IndexError│    └── KeyError├── OSError│    ├── FileNotFoundError│    └── PermissionError└── ValueError

2. 常見異常示例

# 文件操作
try:with open("nonexist.txt") as f:content = f.read()
except FileNotFoundError:print("文件不存在")# 類型轉換
try:num = int("abc")
except ValueError:print("無效的數字格式")# 字典操作
d = {"key": "value"}
try:print(d["missing"])
except KeyError:print("鍵不存在")

三、多重異常處理

1. 合并捕獲

try:# 可能拋出多種異常的代碼
except (TypeError, ValueError) as e:print(f"輸入類型錯誤: {e}")

2. 分層處理

try:data = json.loads(invalid_json)
except json.JSONDecodeError:print("JSON解析失敗")
except Exception:print("其他未知錯誤")

四、finally與else子句

1. finally 應用場景

file = None
try:file = open("data.txt", "r")process(file)
except IOError:print("文件操作錯誤")
finally:if file:file.close()  # 確保資源釋放

2. else 使用技巧


try:result = risky_operation()
except NetworkError:handle_error()
else:save_result(result)  # 僅在成功時執行

五、自定義異常

1. 創建異常類

class InvalidEmailError(ValueError):"""自定義郵箱格式異常"""def __init__(self, email):super().__init__(f"無效郵箱格式: {email}")self.email = email# 使用示例
email = "user@"
if "@" not in email or "." not in email.split("@")[1]:raise InvalidEmailError(email)

2. 異常繼承體系

class DatabaseError(Exception):"""數據庫操作基類異常"""class ConnectionError(DatabaseError):"""數據庫連接異常"""class QueryError(DatabaseError):"""SQL查詢異常"""

六、異常鏈與上下文

1. raise from 語法

try:config = load_config()
except FileNotFoundError as e:raise RuntimeError("配置加載失敗") from e

2. 異常上下文查看

try:# 可能出錯的代碼
except Exception as e:print("原始異常:", e.__cause__)print("上下文:", e.__context__)

七、最佳實踐與陷阱

? 推薦做法

  1. 具體異常捕獲優先
  2. 添加有意義的錯誤信息
raise ValueError(f"無效參數值: {value}")
  1. 日志記錄異常
import logging
try:process()
except Exception:logging.exception("處理失敗")

?? 避免陷阱

  1. 捕獲過于寬泛的異常
try:...
except:  # 捕獲所有異常,包括KeyboardInterruptpass
  1. 忽略異常
try:...
except Exception:pass  # 靜默失敗
  1. 重復拋出異常
try:...
except Exception as e:print(e)raise  # 保留原始堆棧信息

綜合實戰案例

網絡請求重試機制

import requests
from time import sleepdef fetch_data(url, retries=3):for attempt in range(retries):try:response = requests.get(url, timeout=5)response.raise_for_status()return response.json()except requests.HTTPError as e:print(f"HTTP錯誤: {e}")except requests.Timeout:print("請求超時")except requests.RequestException:print("網絡連接問題")if attempt < retries - 1:sleep(2 ** attempt)  # 指數退避raise Exception(f"請求失敗,已重試{retries}次")# 使用示例
data = fetch_data("https://api.example.com/data")

通過掌握這些異常處理技巧,您可以:

  • 編寫更健壯的程序
  • 提高錯誤診斷效率
  • 創建更友好的用戶交互體驗
  • 構建可維護的異常處理體系

建議在實際開發中結合具體業務場景,設計合理的異常處理策略,并定期審查異常處理代碼的有效性

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

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

相關文章

【Qt】Ubuntu22.04使用命令安裝Qt5和Qt6

1、安裝Qt5 注意:Ubuntu22.04已經沒有 qt5-default ,因此不能一鍵安裝啦 1)安裝核心組件 sudo apt install qtbase5-dev qtchooser qt5-qmake qtcreator2)安裝QtCreator sudo apt install qtcreator3)安裝工具包、Qt Quick 開發的核心庫(qtdeclarative5-dev) sudo a…

手擼一個 deepseek 數據庫對話,打造一個企業智能通訊錄(ollama + deepseek + langchain)

前言 由于 deepseek 等大語言模型數據時效性問題&#xff0c;無法跟上現實世界信息的動態變化&#xff0c;企業內部信息更是無法理解&#xff0c;為了將 deepseek 應用到企業內部&#xff0c;之前有寫過通過聯網搜索、上傳文件、搭建知識等檢索增強生成&#xff08;RAG&#xf…

線段樹SegmentTree

線段樹當中的幾個重要操作 1.PushUp 上推操作&#xff1a;由子節點算父節點的信息 p u s h u p push up pushup 操作的目的是為了維護父子節點之間的邏輯關系。當我們遞歸建樹時&#xff0c;對于每一個節點我們都需要遍歷一遍&#xff0c;并且電腦中的遞歸實際意義是先向底層…

SSH免密登錄服務器方法

Window免密連接Linux系統 生成公匙 ssh-keygen -t rsa一路回車生成公鑰 復制公匙&#xff0c;使用記事本打開復制全部內容 notepad C:\Users\DELL\.ssh\id_rsa.pub內容如"ssh-rsa AAAAB3NzaC1yc2EAAAA…" 遠程登錄服務器將內容寫入~/.ssh/authorized_keys echo …

Go 1.24 新特性解析:泛型類型別名、弱指針與終結器改進

文章精選推薦 1 JetBrains Ai assistant 編程工具讓你的工作效率翻倍 2 Extra Icons&#xff1a;JetBrains IDE的圖標增強神器 3 IDEA插件推薦-SequenceDiagram&#xff0c;自動生成時序圖 4 BashSupport Pro 這個ides插件主要是用來干嘛的 &#xff1f; 5 IDEA必裝的插件&…

MySQL 表 t1 建立聯合索引 (a, b, c),在 where a < ? and b > ? and c < ? 中哪些索引生效

文章目錄 聯合索引 abc 均范圍掃描時的索引生效情況無回表 表數據量非常少無回表 表數據量多有回表總結 聯合索引 abc 均范圍掃描時的索引生效情況 場景&#xff1a;表 t1 建立聯合索引 (a, b, c)&#xff0c;在 where a < ? and b > ? and c < ? 中哪些索引生效…

海外營收占比近4成,泡泡瑪特全球化戰略迎收獲期

3月26日&#xff0c;泡泡瑪特國際集團發布2024全年財報。財報顯示&#xff0c;2024年泡泡瑪特實現營收130.4億元&#xff08;人民幣&#xff0c;下同&#xff09;&#xff0c;同比增長106.9%&#xff0c;經調整凈利潤34.0億元&#xff0c;同比增長185.9%。中國內地營收79.7億元…

ctf-web: 不統一的解析 + sql注入要求輸入與輸出相等 -- tpctf supersqli

# 從 django.shortcuts 模塊導入 render 函數&#xff0c;用于渲染模板 from django.shortcuts import render # 從 django.db 模塊導入 connection 對象&#xff0c;用于數據庫連接 from django.db import connection# 此模塊用于創建視圖函數 # 從 django.http 模塊導入 Http…

LLM推理加速框架有哪些

LLM推理加速框架有哪些 目錄 LLM推理加速框架有哪些1. TensorRT簡介簡單使用示例2. Triton Inference Server簡介簡單使用示例3. SGLang簡介簡單使用示例4. vLLM簡介簡單使用示例1. TensorRT 簡介 TensorRT 是 NVIDIA 推出的一個用于高性能深度學習推理的 SDK。它能夠對訓練好…

【深度學習與實戰】2.1、線性回歸模型與梯度下降法先導案例--最小二乘法(向量形式求解)

為了求解損失函數 對 的導數&#xff0c;并利用最小二乘法向量形式求解 的值&#xff0c;我們按照以下步驟進行&#xff1a; ?1. 損失函數的含義? 這是?線性回歸?的平方誤差損失函數&#xff0c;目標是最小化預測值 與真實值 之間的差距。 ?定義損失函數?&#xf…

S7-1200對V90 PN進行位置控制的三種方法

S7-1200系列PLC通過PROFINET與V90 PN伺服驅動器搭配進行位置控制,實現的方法主要有以下三種: ? 方法一、在PLC中組態位置軸工藝對象,V90使用標準報文3,通過MC_Power、MC_MoveAbsolute等PLC Open標準程序塊進行控制, 這種控制方式屬于中央控制方式(位置控制在PLC中計算,驅…

愛普生FC-135晶振5G手機的極端溫度性能守護者

在5G時代&#xff0c;智能手機不僅需要高速率與低延遲&#xff0c;更需在嚴寒、酷暑、振動等復雜環境中保持穩定運行。作為 5G 手機的核心時鐘源&#xff0c;愛普生32.768kHz晶振FC-135憑借其寬溫適應性、高精度穩定性與微型化設計&#xff0c;成為5G手機核心時鐘源的理想選擇&…

ROS--IMU數據包

IMU慣性測量單元 一&#xff1a;IMU二&#xff1a;ROS中三&#xff1a;IMU數據包三&#xff1a;總結 提示&#xff1a;以下是本篇文章正文內容&#xff0c;下面案例可供參考 一&#xff1a;IMU IMU&#xff08;Inertial Measurement Unit&#xff0c;慣性測量單元&#xff09…

數據文件誤刪除,OceanBase中如何重建受影響的節點

當不慎誤刪數據文件且當前沒有現成的可替換節點時&#xff0c;在OceanBase中&#xff0c;不必急于采取極端措施&#xff0c;可以考慮運用 server_permanent_offline_time 參數&#xff0c;來重建受影響的節點。 原理&#xff1a; server_permanent_offline_time 是 OceanBase數…

Python:匹配多個字符,如何匹配開頭

匹配字符0次或無數次(*)&#xff1a; import re resre.match([A-Z][a-z]*,Lihailu) print(res.group())#提取數據 輸出結果可以全部輸出 匹配字符至少一次()&#xff1a; import re resre.match([A-Za-z]python,apython) print(res.group())#提取數據(后邊只寫python會…

Unity-RectTransform設置UI width

不知道有沒人需要這樣的代碼&#xff0c;就是.sizeDelta //不確定是不是英文翻譯的原因&#xff0c;基本很難理解&#xff0c;sizeDeltaSize&#xff0c;//未必完全正確&#xff0c;但這么寫好像總沒錯過 //image 在一個UnityEngine.UI.Image 的數組內foreach (var image in l…

java學習——函數式編程(1)

函數式編程 Java 的函數式編程是一種以函數為核心構建邏輯的編程范式,強調不可變性、聲明式代碼和無副作用的操作。它通過Lambda表達式、函數式接口(如Function、Predicate、Consumer等)和Stream API等特性實現,將計算過程抽象為函數的組合與轉換,而非傳統的命令式步驟。…

AP CSA FRQ Q2 Past Paper 五年真題匯總 2023-2019

Author(wechat): bigshuang2020 ap csa tutor, providing 1-on-1 tutoring. 國際教育計算機老師, 擅長答疑講解&#xff0c;帶學生實踐學習。 熱愛創作&#xff0c;作品&#xff1a;ap csa原創雙語教案&#xff0c;真題梳理匯總&#xff0c; AP CSA FRQ專題沖刺, AP CSA MCQ小題…

線程池詳解:在SpringBoot中的最佳實踐

線程池詳解&#xff1a;在SpringBoot中的最佳實踐 引言 在Java并發編程中&#xff0c;線程池是一種非常重要的資源管理工具&#xff0c;它允許我們在應用程序中有效地管理和重用線程&#xff0c;從而提高性能并降低資源消耗。特別是在SpringBoot等企業級應用中&#xff0c;正…

2025年IT行業技術革命全景解析:從AI到量子計算的落地實踐

簡介 2025年&#xff0c;全球IT行業正經歷一場由AI、量子計算、物聯網等技術驅動的變革。從BOE的AI制造系統到德易科技的無人機光伏巡檢&#xff0c;從鯤鵬處理器的國產化突破到量子計算的算力革命&#xff0c;技術創新正在重塑產業格局。本文結合最新行業動態與實戰案例&…