Python 中 try / except / else / finally 異常處理詳解

1. 基本結構

try:# 可能會拋出異常的代碼
except SomeException as e:# 捕獲并處理異常
else:# 如果 try 中代碼沒有異常,就執行這里
finally:# 無論是否發生異常,最后都會執行這里

2. 各部分的作用

try

  • 用途:包含可能發生異常的代碼段。
  • 如果代碼沒有異常,則 except 不會被執行,直接進入 else(如果有的話)。
  • 如果有異常,則轉到對應的 except

except

  • 用途:捕獲并處理異常。
  • 可以寫多個 except,匹配不同的異常類型。

示例:

try:x = int("abc")  # 會觸發 ValueError
except ValueError:print("捕獲到 ValueError")
except TypeError:print("捕獲到 TypeError")

else

  • 用途只有當 try 中沒有發生任何異常時 才會執行。
  • 常用于把 不需要異常保護的邏輯 放在這里,讓 try 中的代碼盡量簡潔。

示例:

try:result = 10 / 2
except ZeroDivisionError:print("除零錯誤")
else:print("計算成功,結果是:", result)

運行結果:

計算成功,結果是: 5.0

finally

  • 用途無論是否發生異常,都會執行。
  • 常用于資源釋放、文件關閉、鎖釋放等。

示例:

try:f = open("test.txt", "r")data = f.read()
except FileNotFoundError:print("文件不存在")
else:print("讀取成功")
finally:print("執行 finally")if 'f' in locals() and not f.closed:f.close()

3. 執行流程總結

情況tryexceptelsefinally
沒有異常執行跳過執行執行
有異常,匹配到執行到異常處中斷執行跳過執行
有異常,未匹配到執行到異常處中斷不執行不執行執行(然后異常繼續向上拋出)

4. 常見用法

(1)多個 except

try:x = int("abc")
except ValueError:print("數值錯誤")
except Exception as e:print("其他異常:", e)

(2)捕獲多個異常

try:x = int("abc")
except (ValueError, TypeError) as e:print("捕獲到異常:", e)

(3)用 else 處理后續邏輯

try:num = int("123")
except ValueError:print("轉換失敗")
else:print("轉換成功,結果是:", num)

(4)finally 釋放資源

try:f = open("data.txt", "r")data = f.read()
except FileNotFoundError:print("文件沒找到")
finally:print("關閉文件")if 'f' in locals() and not f.closed:f.close()

5. 容易踩的坑

  1. finally 中的 return 會覆蓋異常
def foo():try:return 1finally:return 2print(foo())  # 輸出 2,而不是 1

說明:finally 里的 returnbreakcontinue 都會覆蓋 try/except/else 的返回值或異常。

  1. 過度使用 try

    • 最佳實踐:只把 可能發生異常的最小代碼塊 放進 try,不要把一大段邏輯全包進去。

6.常用場景示例

下面 6 個示例覆蓋了:

  1. 文件操作
  2. 用戶輸入
  3. 網絡請求
  4. 多異常捕獲
  5. 數據庫操作
  6. 臨時文件清理

示例 1:文件讀取(帶 finally 關閉資源)

try:f = open("test.txt", "r")data = f.read()
except FileNotFoundError:print("文件不存在")
else:print("文件內容:", data)
finally:if 'f' in locals() and not f.closed:f.close()print("文件已關閉")

應用場景:文件操作時,確保資源一定會被關閉。


示例 2:用戶輸入校驗

try:num = int(input("請輸入一個整數: "))
except ValueError:print("輸入無效,請輸入整數!")
else:print("你輸入的整數是:", num)

應用場景:處理用戶輸入時防止格式錯誤。


示例 3:網絡請求(簡化版)

import requeststry:response = requests.get("https://httpbin.org/get")data = response.json()
except requests.RequestException as e:print("請求失敗:", e)
else:print("請求成功,返回數據:", data)
finally:print("請求結束")

應用場景:網絡請求一定要有異常處理,否則一旦超時或斷網就會崩潰。


示例 4:多個異常捕獲

try:x = int("abc")  # ValueErrory = 10 / 0      # ZeroDivisionError
except ValueError:print("數值轉換錯誤")
except ZeroDivisionError:print("除零錯誤")
except Exception as e:print("其他錯誤:", e)

應用場景:針對不同錯誤分類處理,更清晰。


示例 5:數據庫操作(帶 finally 釋放連接)

class FakeDB:def connect(self): print("連接數據庫")def close(self): print("關閉數據庫")def query(self): return [1, 2, 3]db = FakeDB()
try:db.connect()result = db.query()
except Exception as e:print("查詢失敗:", e)
else:print("查詢結果:", result)
finally:db.close()

應用場景:數據庫、消息隊列、Socket等操作中保證資源一定釋放。


示例 6:finally 保證清理臨時文件

import ostry:with open("temp.txt", "w") as f:f.write("臨時數據")raise RuntimeError("模擬出錯")
except RuntimeError as e:print("捕獲到異常:", e)
finally:if os.path.exists("temp.txt"):os.remove("temp.txt")print("臨時文件已刪除")

應用場景:程序中斷時確保臨時文件、緩存不會遺留。


7. 總結口訣

  • try:放可能出錯的代碼
  • except:出錯就處理
  • else:沒出錯才執行
  • finally:一定會執行

高級應用內容

高級應用主要涉及:

  1. 異常鏈:處理后再拋出
  2. 自定義異常:模塊化項目常用
  3. 上下文管理器:優雅封裝 try/finally
  4. 邏輯分層else 只放成功邏輯
  5. finally 覆蓋陷阱:調試必知
  6. contextlib.suppress:優雅忽略異常
  7. 事務回滾:數據庫/分布式系統
  8. 多線程異常處理:防止異常丟失
    下面分別舉例說明,具體內容如下:

1. 捕獲并重新拋出異常(異常鏈)

有時需要先處理一下,再把異常繼續拋給上層:

def process_data(data):try:return int(data)except ValueError as e:print("日志記錄:數據轉換失敗 ->", e)raise   # 重新拋出異常,讓上層調用者知道

應用場景:日志記錄、錯誤追蹤。


2. 自定義異常類

在工程里,為了更清晰區分錯誤類型,常會定義自家異常:

class DataFormatError(Exception):passdef load_data(data):if not isinstance(data, dict):raise DataFormatError("數據必須是字典類型")try:load_data("not_dict")
except DataFormatError as e:print("捕獲到自定義異常:", e)

應用場景:大型項目中,給模塊定義專屬錯誤類型,便于精確捕獲。


3. with 上下文管理器的異常處理

上下文管理器的 __exit__ 方法可以接收異常,并決定是否吞掉:

class Demo:def __enter__(self):print("進入上下文")return selfdef __exit__(self, exc_type, exc_val, exc_tb):print("退出上下文")if exc_type:print("捕獲異常:", exc_type, exc_val)return True  # 返回 True 表示異常已處理,不會再拋出with Demo():print("運行中...")raise ValueError("測試異常")
print("程序繼續執行")

應用場景:數據庫事務、文件操作、鎖等,結合 try/finally 自動化資源管理。


4. try/except/else 結合邏輯分層

try 只負責可能出錯的部分,后續邏輯放到 else,保持結構清晰:

try:f = open("config.json")config = f.read()
except FileNotFoundError:print("配置文件缺失")
else:print("配置文件加載成功")
finally:if 'f' in locals():f.close()

應用場景:避免把無關代碼放進 try,提高可讀性。


5. finally 中的清理 vs. 異常屏蔽

注意:如果 finally 里有 return/raise,會覆蓋原異常:

def test():try:1 / 0except ZeroDivisionError:print("捕獲到異常")raisefinally:return "finally 覆蓋了異常"print(test())  # 輸出 "finally 覆蓋了異常"

應用場景:調試時要小心,避免無意中吞掉異常。


6. contextlib.suppress —— 優雅忽略異常

Python 內置的工具類,可以用來代替 try/except/pass

import contextlibwith contextlib.suppress(FileNotFoundError):with open("no_such_file.txt") as f:data = f.read()print("即使文件不存在,程序也能繼續運行")

應用場景:當你明確不關心某些異常時,代碼更簡潔。


7. 異常和事務(數據庫/分布式)

很多數據庫驅動會在 try/except/finally 中實現事務控制:

try:db.begin()db.insert("users", {"id": 1, "name": "Alice"})db.commit()
except Exception as e:db.rollback()print("事務失敗:", e)

應用場景:保證數據一致性。


8. 異常與多線程

在多線程中,子線程的異常不會自動傳遞到主線程,需要顯式捕獲:

import threadingdef worker():try:1 / 0except Exception as e:print("子線程異常:", e)t = threading.Thread(target=worker)
t.start()
t.join()

應用場景:多線程/異步編程中異常管理。


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

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

相關文章

冰火島 Tech 傳:Apple Foundation Models 心法解密(下集)

引子 上集說到冰火島冰屋內,謝遜、張翠山、殷素素三人親見 “指令(Instructions)” 如何讓 AI 脫胎換骨,從木訥報地名的 “愣頭青”,變身為文采斐然的 “旅行作家”。 正當素素驚嘆這 AI 武學的奇妙時,謝遜卻突然神色一凜,指著手腕上用冰屑刻的 “4096” 字樣道:“這等…

Qt信號與槽機制全面解析

? 1. 核心概念信號與槽是Qt獨創的一種對象間通信機制,它使得一個對象的狀態變化或事件發生能夠自動通知其他對象作出響應,從而實現高度解耦的代碼設計。1.1 信號(Signals)定義:信號是由對象在特定事件發生時發出&…

2025年COR SCI2區,基于近似細胞分解的能源高效無人機路徑規劃問題用于地質災害監測,深度解析+性能實測

目錄1.摘要2.問題描述與數學模型3.能源網格混合元啟發式算法4.結果展示5.參考文獻6.代碼獲取7.算法輔導應用定制讀者交流1.摘要 本文提出了一種能源高效的無人機路徑規劃方法(EURP)用于監測分散的地質災害易發區域,通過建立無人機飛行模式的…

LangChain關于提示詞的幾種寫法

上文中 <---->(可點擊移步查閱),我們已經了解到LangChain如何編寫調用大模型的一個基本框架, 在編寫完這個基本框架后,就要與大模型進行交互了,這時候,就需要我們編寫提示詞了, 那么以下,就會介紹提示詞的幾種編寫方式 1 可攜帶變量的提示詞 1.1 PromptTempla…

CyberPoC 是一個現代化的網絡安全練習和競賽平臺,支持容器化部署的安全挑戰,為用戶提供實踐網絡安全技能的環境。

工具介紹 CyberPoC 是一個現代化的網絡安全練習和競賽平臺&#xff0c;支持容器化部署的安全挑戰&#xff0c;為用戶提供實踐網絡安全技能的環境。 &#x1f680; 快速開始 使用 Docker Compose (推薦) 克隆項目 git clone https://github.com/dushixiang/cyberpoc.gitcd cy…

【單片機day03】

UART串口通用異步收發器&#xff0c;2個串口(1個串口被用于ISP下載程序&#xff0c;1個串口被用于和主機之間的通信)全雙工&#xff08;兩根線TX、RX&#xff09;、串行、異步通信方式&#xff1a;單工&#xff1a;發送方和接收方是固定的&#xff0c;數據只能從發送方 發給 …

react16到react19更新及底層實現是什么以及區別

好問題 &#x1f44d;。React 16 → 19 的更新跨度其實涵蓋了 React 的幾個“時代級”的演進&#xff1a;從 Fiber 架構 的重寫、到 并發特性 的引入&#xff0c;再到 React Server Components 和 現代語法支持。我幫你梳理下主要更新點和底層實現的區別&#xff0c;方便你系統…

【分享】基于百度腦圖,并使用Vue二次開發的用例腦圖編輯器組件

偶然間發現了這個項目&#xff0c;分享出來。 【分享】基于百度腦圖&#xff0c;并使用Vue二次開發的用例腦圖編輯器組件1 項目地址2 項目簡介3 項目部署3.1 安裝node和npm3.2 項目下載3.3 修改npm鏡像源3.4 部署4 項目中使用1 項目地址 基于百度腦圖&#xff0c;并使用Vue二次…

Kotlin中抽象類和開放類

抽象類 (Abstract Class) 定義和特點 抽象類使用 abstract 關鍵字聲明&#xff0c;是一種不能被直接實例化的特殊類&#xff0c;主要用于被其他類繼承。 abstract class Base {open fun f() {} }abstract class Derived : Base() {override abstract fun f() // 抽象成員在類中…

TensorFlow深度學習實戰(37)——深度學習的數學原理

TensorFlow深度學習實戰&#xff08;37&#xff09;——深度學習的數學原理0. 前言1. 反向傳播歷史2. 微積分相關概念2.1 向量2.2 導數和梯度2.3 梯度下降2.4 鏈式法則2.5 常用求導公式2.6 矩陣運算3. 激活函數4. 反向傳播4.1 前向計算4.2 反向傳播5. 交叉熵及其導數6. 批量梯度…

1.1 汽車運行滾動阻力

汽車運行阻力由4部分構成&#xff1a;滾動阻力、空氣阻力、坡度阻力、加速阻力。 1).汽車在水平道路上等速行駛時&#xff0c;必須克服來自地面的滾動阻力和來自空氣的空氣阻力。 2). 當汽車在坡道上上坡行駛時&#xff0c;還必須克服重力沿坡道的分力&#xff0c;稱為坡度阻…

e203000

1&#xff09;①BIU作為核心通信樞紐&#xff0c;主要承擔兩大功能&#xff1a;一是連接處理器核內的關鍵執行單元&#xff08;包括IFU、LSU和EAI協處理器&#xff09;&#xff0c;統一管理指令和數據的內部傳輸路徑&#xff1b;二是作為"核內計算"與"核外資源&…

Infortrend普安科技IEC私有云平臺VM解決方案

Infortrend企業云&#xff08;IEC&#xff09;內置Hypervisor運行VM。功能完整、無需額外付費。在本文中&#xff0c;我們將為您詳細介紹IEC是如何支持 VM的。市場現狀與挑戰市場現狀 虛擬化市場面臨轉型&#xff0c;主流廠商&#xff08;如 VMware&#xff09;改用訂閱制…

【代碼隨想錄算法訓練營——Day6(Day5周日休息)】哈希表——242.有效的字母異位詞、349.兩個數組的交集、202.快樂數、1.兩數之和

LeetCode題目鏈接 https://leetcode.cn/problems/valid-anagram/ https://leetcode.cn/problems/intersection-of-two-arrays/ https://leetcode.cn/problems/happy-number/ https://leetcode.cn/problems/two-sum/ 題解 242.有效的字母異位詞 這道題要想到用哈希表來做。同時注…

安科瑞基站智慧運維云平臺:安全管控與節能降耗雙效賦能

功能&#xff1a;基站智慧用電云平臺通過對5G宏站和室分站點加裝交/直流智能監控設備、無線采集設備以及系統管理平臺&#xff0c;完成夜間無業務時段的下電操作&#xff0c;減少電能消耗&#xff0c;降低運營成本支出&#xff0c;以及提升通信設備供電線路狀態的實時監測保護功…

處理省市區excel數據加工成SQL

原始數據相關內容鏈接 處理excel數據加工成SQL的腳本 #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Excel行政區域數據轉SQL腳本 - 支持特殊行政單位處理&#xff08;如省直轄縣級行政單位&#xff09; - 支持批量處理 """import pand…

雙碳目標下的24小時分時綜合能源系統低碳優化調度:基于 Matlab/YALMIP/CPLEX的方法與仿真

在“雙碳”戰略目標的推動下&#xff0c;綜合能源系統&#xff08;Integrated Energy System, IES&#xff09;已成為實現能源結構優化與碳排放控制的重要途徑。本文以光伏、風電、燃氣—電熱聯產&#xff08;CHP&#xff09;、燃氣鍋爐、電鍋爐、電儲能以及碳捕集&#xff08;…

TDengine 選擇函數 Last() 用戶手冊

LAST() 函數用戶手冊 函數定義 LAST(expr)功能說明 LAST() 函數統計表/超級表中某列的值最后寫入的非 NULL 值&#xff0c;即返回時間戳最大的非 NULL 值。 版本要求 最低版本: v3.0.0.0 返回值 數據類型: 同應用的字段返回內容: 時間戳最大的非 NULL 值及其對應的時間戳…

< 自用文 學習 > 用 Claude Code 做一個日歷

環境&#xff1a; OS: Windows 11 IDE&#xff1a;TREA Model: Sonnet / Qwen (免費 Token 用完) 參考&#xff1a; Claude Code Beginner Guide – Get Started in 20 Minutes (2025) by Alex Finn 油管博客 https://www.youtube.com/watch?viYiuzAsWnHU&listTLGG1L…

Gmail 數據泄露安全警報以及啟示

目前&#xff0c;大規模數據泄露和針對性釣魚攻擊持續威脅著數十億 Gmail 用戶的安全&#xff0c;受ShinyHunters、UNC6040、UNC6395等威脅組織攻擊&#xff0c;25 億 Gmail 用戶面臨極大風險&#xff1b;攻擊者已從暴力破解轉向社會工程學與混合勒索&#xff0c;而密碼復用、弱…