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

Python的try語句(異常處理)用法詳細(xì)介紹

 更新時間:2026年04月21日 09:45:36   作者:*TQK*  
在Python里try語句主要用于異常處理,其作用是捕獲并處理代碼運行期間可能出現(xiàn)的異常,避免程序因異常而意外終止,這篇文章主要介紹了Python中try語句(異常處理)用法的相關(guān)資料,需要的朋友可以參考下

前言

在 Python 中,try語句是異常處理(Error Handling) 的核心機制,用于捕獲和處理程序運行過程中出現(xiàn)的錯誤(如語法錯誤之外的運行時錯誤:除零錯誤、索引越界、網(wǎng)絡(luò)請求失敗等),避免程序因錯誤直接崩潰,讓程序具備更強的魯棒性。(在編程領(lǐng)域,魯棒性(Robustness) 指的是程序在面對異常、錯誤、非法輸入或惡劣環(huán)境時,能夠保持穩(wěn)定運行而不崩潰,并且能合理處理這些異常情況的能力。簡單來說,就是程序的 “抗造”“耐折騰” 程度。)

一、異常的基本概念

異常是程序運行時發(fā)生的不正常情況(錯誤),比如:

  • ZeroDivisionError:除數(shù)為 0;
  • IndexError:列表索引超出范圍;
  • KeyError:字典鍵不存在;
  • requests.exceptions.RequestException:網(wǎng)絡(luò)請求失敗(如超時、連接拒絕);
  • FileNotFoundError:文件不存在。

如果不處理這些異常,程序會直接終止并拋出錯誤信息;而try語句可以捕獲這些異常,并執(zhí)行自定義的處理邏輯。

二、try 語句的完整語法結(jié)構(gòu)

Python 的try語句有多種組合形式,從簡單到復(fù)雜依次為:try-excepttry-except-else、try-except-finally、try-except-else-finally。

1. 基礎(chǔ)結(jié)構(gòu):try-except(核心)

這是最常用的形式,用于捕獲并處理指定的異常。

try:
    # 可能引發(fā)異常的代碼塊(受保護的代碼)
    risky_code()
except [異常類型1] [as 異常對象]:
    # 當(dāng)異常類型1發(fā)生時,執(zhí)行的處理邏輯
    handle_exception1()
except [異常類型2] [as 異常對象]:
    # 當(dāng)異常類型2發(fā)生時,執(zhí)行的處理邏輯
    handle_exception2()
except:
    # 捕獲所有未被上面捕獲的異常(兜底處理,不推薦濫用)
    handle_all_other_exceptions()

關(guān)鍵說明

  • try塊:存放可能出現(xiàn)異常的代碼(如網(wǎng)絡(luò)請求、文件操作、數(shù)據(jù)類型轉(zhuǎn)換等)。
  • except塊:當(dāng)try塊中發(fā)生指定類型的異常時,執(zhí)行該塊的代碼;可以有多個except塊,分別處理不同類型的異常。
  • as 異常對象:可選,用于獲取異常的詳細(xì)信息(如錯誤描述、堆棧信息),常用變量名:e、err。

示例 1:捕獲特定異常

try:
    a = 10 / 0  # 會引發(fā)ZeroDivisionError
    b = [1, 2, 3][5]  # 會引發(fā)IndexError(但上面的錯誤先發(fā)生,這行不會執(zhí)行)
except ZeroDivisionError as e:
    print(f"錯誤:除數(shù)不能為0,異常信息:{e}")
except IndexError as e:
    print(f"錯誤:索引越界,異常信息:{e}")

輸出:錯誤:除數(shù)不能為0,異常信息:division by zero

示例 2:捕獲多個異常(簡寫)如果多個異常的處理邏輯相同,可以將它們放在一個except塊中,用元組包裹:

try:
    data = {"name": "張三"}
    print(data["age"])  # KeyError
    # num = int("abc")  # ValueError
except (KeyError, ValueError) as e:
    print(f"發(fā)生了鍵錯誤或值錯誤:{e}")

示例 3:兜底捕獲所有異常(不推薦)使用無參數(shù)的except可以捕獲所有異常,但會隱藏未知的錯誤,不利于調(diào)試,僅建議在程序頂層做兜底處理:

try:
    10 / 0
except ZeroDivisionError as e:
    print(f"除數(shù)為0:{e}")
except:
    print(f"發(fā)生了未知錯誤:{e}")  # 兜底處理

2. 擴展結(jié)構(gòu):try-except-else

當(dāng)try塊中沒有發(fā)生任何異常時,會執(zhí)行else塊的代碼(else塊是可選的)。

try:
    # 可能引發(fā)異常的代碼
    result = 10 / 2
except ZeroDivisionError as e:
    print(f"錯誤:{e}")
else:
    # 無異常時執(zhí)行的代碼
    print(f"計算結(jié)果:{result}")

輸出:計算結(jié)果:5.0

作用將 “正常邏輯” 和 “異常處理邏輯” 分離,代碼結(jié)構(gòu)更清晰(else塊只執(zhí)行正常情況的邏輯)。

  1. 僅當(dāng)try塊中的代碼
    • 正常執(zhí)行完畢(沒有引發(fā)任何異常);
    • 且沒有被return、breakcontinue等語句中斷;
    • 才會執(zhí)行else塊的代碼。
  2. 如果try塊中引發(fā)了異常
    • 程序會立即跳轉(zhuǎn)到對應(yīng)的except塊中執(zhí)行異常處理邏輯;
    • else塊的代碼會被完全跳過,不會執(zhí)行。

3. 完整結(jié)構(gòu):try-except-finally

finally塊中的代碼無論是否發(fā)生異常,都會執(zhí)行finally塊是可選的),常用于釋放資源(如關(guān)閉文件、關(guān)閉網(wǎng)絡(luò)連接、釋放鎖等)。

try:
    # 可能引發(fā)異常的代碼
    f = open("test.txt", "r")
    content = f.read()
except FileNotFoundError as e:
    print(f"錯誤:文件不存在,{e}")
finally:
    # 無論是否異常,都會執(zhí)行:關(guān)閉文件
    if 'f' in locals() and not f.closed:
        f.close()
        print("文件已關(guān)閉")

關(guān)鍵特性

  • 即使try塊中有return、break、continue等語句,finally塊仍會執(zhí)行;
  • 常用于資源的清理工作,避免資源泄漏。

4. 終極結(jié)構(gòu):try-except-else-finally

整合所有部分,覆蓋所有場景:

try:
    num = int(input("請輸入一個整數(shù):"))
    result = 10 / num
except ValueError as e:
    print(f"錯誤:請輸入有效的整數(shù),{e}")
except ZeroDivisionError as e:
    print(f"錯誤:除數(shù)不能為0,{e}")
else:
    print(f"10 / {num} = {result}")
finally:
    print("程序執(zhí)行完畢(無論是否異常,都會顯示)")

三、異常對象的常用操作

通過as 異常對象可以獲取異常的詳細(xì)信息,常用操作:

  1. 直接打印異常對象:獲取錯誤描述(如print(e));
  2. 獲取異常類型type(e);
  3. 獲取異常的堆棧信息:使用traceback模塊(適合調(diào)試)。
import traceback
try:
    10 / 0
except Exception as e:
    # 打印錯誤描述
    print(f"異常描述:{e}")
    # 打印異常類型
    print(f"異常類型:{type(e)}")
    # 打印完整的堆棧信息(包含出錯的行號、文件路徑)
    print("堆棧信息:")
    traceback.print_exc()

五、try 語句的使用場景(爬蟲 / 開發(fā)常用)

1. 網(wǎng)絡(luò)請求(處理網(wǎng)絡(luò)異常)

爬蟲中網(wǎng)絡(luò)請求容易出現(xiàn)超時、連接拒絕、DNS 錯誤等異常,必須用try處理:

import requests
HEADERS = {"User-Agent": "Mozilla/5.0"}
url = "https://movie.douban.com/top250"
try:
    response = requests.get(url, headers=HEADERS, timeout=10)
    response.raise_for_status()  # 觸發(fā)HTTP錯誤(如403、404、500)
except requests.exceptions.Timeout as e:
    print(f"錯誤:請求超時,{e}")
except requests.exceptions.HTTPError as e:
    print(f"錯誤:HTTP狀態(tài)碼異常,{e}")
except requests.exceptions.RequestException as e:
    print(f"錯誤:網(wǎng)絡(luò)請求失敗,{e}")
else:
    print(f"請求成功,狀態(tài)碼:{response.status_code}")

2. 文件操作(處理文件不存在、權(quán)限錯誤)

try:
    with open("douban_top50.csv", "r", encoding="utf-8-sig") as f:
        content = f.read()
except FileNotFoundError as e:
    print(f"錯誤:文件不存在,{e}")
except PermissionError as e:
    print(f"錯誤:沒有文件讀取權(quán)限,{e}")
except UnicodeDecodeError as e:
    print(f"錯誤:文件編碼錯誤,{e}")
else:
    print(f"文件讀取成功,內(nèi)容長度:{len(content)}")

3. 數(shù)據(jù)解析(處理數(shù)據(jù)格式異常)

爬蟲解析數(shù)據(jù)時,可能因網(wǎng)頁結(jié)構(gòu)變化導(dǎo)致標(biāo)簽不存在,需處理異常:

from bs4 import BeautifulSoup
html = '<div class="item"><span class="title">肖申克的救贖</span></div>'
soup = BeautifulSoup(html, "html.parser")
try:
    movie_name = soup.find("span", class_="title").text
    movie_score = soup.find("span", class_="rating_num").text  # 該標(biāo)簽不存在,觸發(fā)AttributeError
except AttributeError as e:
    print(f"錯誤:標(biāo)簽不存在,{e}")
    movie_score = "未知"
finally:
    print(f"電影名稱:{movie_name},評分:{movie_score}")

輸出:錯誤:標(biāo)簽不存在,'NoneType' object has no attribute 'text'電影名稱:肖申克的救贖,評分:未知

六、使用 try 的最佳實踐

  1. 精準(zhǔn)捕獲異常:盡量捕獲具體的異常類型(如ZeroDivisionError),避免使用無參數(shù)的except(兜底除外),否則會隱藏未知錯誤;
  2. 保持 try 塊最小化:只在try塊中放入可能引發(fā)異常的代碼,不要將無關(guān)代碼放入,便于定位錯誤;
  3. 使用 finally 釋放資源:對于文件、網(wǎng)絡(luò)連接、數(shù)據(jù)庫連接等資源,務(wù)必在finally中釋放,或使用上下文管理器(with語句,底層也是基于finally實現(xiàn));
  4. 異常信息要明確:處理異常時,打印清晰的錯誤信息(如異常類型、錯誤原因、發(fā)生位置),便于調(diào)試;
  5. 避免過度使用異常:異常處理是為了處理不可預(yù)見的錯誤,不要用異常處理替代正常的邏輯判斷(如不要用try-except判斷列表是否為空,應(yīng)直接用if not lst)。

七、與上下文管理器(with 語句)的結(jié)合

Python 中的with語句是異常處理的語法糖,常用于資源管理(如文件、網(wǎng)絡(luò)連接),它會自動在代碼塊結(jié)束后釋放資源,即使發(fā)生異常也不例外(底層調(diào)用了__enter__和__exit__方法,__exit__中包含了finally的邏輯)。

示例:用 with 語句簡化文件操作(替代 try-finally)

# 無需手動關(guān)閉文件,with語句會自動處理
try:
    with open("test.txt", "r") as f:
        content = f.read()
except FileNotFoundError as e:
    print(f"錯誤:文件不存在,{e}")
else:
    print(f"文件內(nèi)容:{content}")

總結(jié)

Python 的try語句是處理運行時異常的核心工具,通過try-except捕獲異常、else執(zhí)行正常邏輯、finally釋放資源,能讓程序在面對錯誤時更健壯。在爬蟲、文件操作、數(shù)據(jù)處理等場景中,合理使用try語句是編寫生產(chǎn)級代碼的必備技能。同時,遵循精準(zhǔn)捕獲、最小化 try 塊、明確異常信息等最佳實踐,能讓異常處理代碼更優(yōu)雅、更易維護。

到此這篇關(guān)于Python的try語句(異常處理)用法的文章就介紹到這了,更多相關(guān)Python的try異常處理語句內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • centos6.7安裝python2.7.11的具體方法

    centos6.7安裝python2.7.11的具體方法

    下面小編就為大家?guī)硪黄猚entos6.7安裝python2.7.11的具體方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • python函數(shù)的萬能參數(shù)傳參詳解

    python函數(shù)的萬能參數(shù)傳參詳解

    這篇文章主要介紹了python函數(shù)的萬能參數(shù)傳參詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07
  • python中numpy數(shù)組的csv文件寫入與讀取

    python中numpy數(shù)組的csv文件寫入與讀取

    本文主要介紹了python中numpy數(shù)組的csv文件寫入與讀取,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Python Django項目和應(yīng)用的創(chuàng)建詳解

    Python Django項目和應(yīng)用的創(chuàng)建詳解

    這篇文章主要為大家介紹了Python Django項目和應(yīng)用的創(chuàng)建,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • Python+OpenCV實現(xiàn)圖片中的圓形檢測

    Python+OpenCV實現(xiàn)圖片中的圓形檢測

    這篇文章主要介紹了如何利用Python+OpenCV實現(xiàn)檢測圖片中的圓形,文中的示例代碼講解詳細(xì),感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一下
    2022-04-04
  • Python實現(xiàn)的調(diào)用C語言函數(shù)功能簡單實例

    Python實現(xiàn)的調(diào)用C語言函數(shù)功能簡單實例

    這篇文章主要介紹了Python實現(xiàn)的調(diào)用C語言函數(shù)功能,結(jié)合簡單實例形式分析了Python使用ctypes模塊調(diào)用C語言函數(shù)的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2019-03-03
  • Python制作微信機器人教程詳解

    Python制作微信機器人教程詳解

    這篇文章主要介紹了Python如何實現(xiàn)微信機器人,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2021-12-12
  • Python中Permission denied的解決方案

    Python中Permission denied的解決方案

    這篇文章主要介紹了Python中Permission denied的解決方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • pandas DataFrame的修改方法(值、列、索引)

    pandas DataFrame的修改方法(值、列、索引)

    這篇文章主要介紹了pandas DataFrame的修改方法(值、列、索引),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 詳細(xì)介紹pandas的DataFrame的append方法使用

    詳細(xì)介紹pandas的DataFrame的append方法使用

    這篇文章主要介紹了詳細(xì)介紹pandas的DataFrame的append方法使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07

最新評論

八宿县| 敦煌市| 包头市| 荔浦县| 平原县| 兴城市| 恩施市| 阜城县| 长岛县| 韩城市| 安陆市| 宣化县| 竹北市| 鞍山市| 杭州市| 玉林市| 三台县| 东兰县| 百色市| 德钦县| 武威市| 柳林县| 阿城市| 黄龙县| 偏关县| 富顺县| 波密县| 双流县| 深泽县| 和田县| 鲁山县| 调兵山市| 沭阳县| 当雄县| 余姚市| 乐业县| 陵川县| 余江县| 泰州市| 孟州市| 镇安县|