Python中web錯(cuò)誤處理與異常捕獲示例詳解
一、概述
在 Web 開(kāi)發(fā)中,錯(cuò)誤處理與異常捕獲是保障服務(wù)穩(wěn)定性和用戶體驗(yàn)的核心機(jī)制:
核心目標(biāo):
防止服務(wù)崩潰:捕獲未處理的異常,避免因單個(gè)請(qǐng)求錯(cuò)誤導(dǎo)致整個(gè)服務(wù)不可用。
友好用戶提示:向客戶端返回有意義的錯(cuò)誤信息(如 404 頁(yè)面、500 錯(cuò)誤頁(yè))。
日志記錄:記錄異常堆棧信息,便于調(diào)試和問(wèn)題追蹤。
常見(jiàn)場(chǎng)景:
數(shù)據(jù)庫(kù)操作失?。ㄈ邕B接超時(shí)、SQL 語(yǔ)法錯(cuò)誤)。
外部 API 調(diào)用異常(如網(wǎng)絡(luò)中斷、響應(yīng)格式錯(cuò)誤)。
用戶輸入校驗(yàn)失敗(如參數(shù)缺失、類(lèi)型不匹配)。
HTTP 錯(cuò)誤碼關(guān)聯(lián):
4xx:客戶端錯(cuò)誤(如400 Bad Request、404 Not Found)。5xx:服務(wù)端錯(cuò)誤(如500 Internal Server Error)。
核心原則
防崩潰:捕獲所有未處理異常,避免服務(wù)中斷。
明日志:記錄異常堆棧,便于調(diào)試。
友好響應(yīng):返回用戶易懂的錯(cuò)誤信息,隱藏敏感細(xì)節(jié)。
二、try 語(yǔ)句
try 語(yǔ)句是 Python 中處理異常的基礎(chǔ)工具,在 Web 開(kāi)發(fā)中用于保護(hù)可能出錯(cuò)的代碼塊。
1.基礎(chǔ)語(yǔ)法
try:
# 可能引發(fā)異常的代碼(如數(shù)據(jù)庫(kù)操作、文件讀寫(xiě))
risky_operation()
except ExceptionType as e:
# 捕獲特定異常并處理
handle_error(e)
else:
# 無(wú)異常時(shí)執(zhí)行(可選)
clean_up()
finally:
# 無(wú)論是否異常都執(zhí)行(如釋放資源)
release_resources() | 代碼塊 | 用途 | 執(zhí)行條件 | 最佳實(shí)踐 |
|---|---|---|---|
try | 包裹可能引發(fā)異常的代碼 | 總是執(zhí)行 | 僅包含可能出錯(cuò)的代碼,避免冗余邏輯。 |
except | 捕獲并處理特定異常 | 當(dāng) try 塊發(fā)生異常時(shí) | 優(yōu)先捕獲具體異常類(lèi)型,避免裸露的 except。 |
else | 執(zhí)行無(wú)異常時(shí)的后續(xù)邏輯 | try 塊無(wú)異常時(shí)執(zhí)行 | 用于分離正常流程和異常處理代碼。 |
finally | 無(wú)論是否異常都執(zhí)行的清理操作 | 總是執(zhí)行 | 釋放資源(如關(guān)閉文件、數(shù)據(jù)庫(kù)連接)。 |
常見(jiàn)異常類(lèi)型
| 異常 | 觸發(fā)場(chǎng)景 |
|---|---|
FileNotFoundError | 文件不存在時(shí)嘗試讀?。ㄈ?nbsp;open("r"))。 |
PermissionError | 無(wú)權(quán)限訪問(wèn)文件(如只讀文件嘗試寫(xiě)入)。 |
IsADirectoryError | 嘗試以文件模式操作目錄。 |
UnicodeDecodeError | 文本文件編碼不匹配(如用 utf-8 讀取 gbk 文件)。 |
一句話總結(jié)
try 防崩潰,except 抓異常,else 走正路,finally 清戰(zhàn)場(chǎng)。
2. 示例:捕獲常見(jiàn)異常
import requests
from requests.exceptions import RequestException, Timeout, HTTPError
try:
#發(fā)送 GET 請(qǐng)求,并設(shè)置超時(shí)時(shí)間為 5 秒
response = requests.get('https://www.example.com', timeout=5)
#如果狀態(tài)碼不是 200, 拋出 HTTPError 異常
response.raise_for_status () # 如果狀態(tài)碼是 404 或 500, 拋出異常
#如果請(qǐng)求成功,則輸出響應(yīng)內(nèi)容
print('Response Body:', response.text)
#捕獲請(qǐng)求超時(shí)異常
except Timeout:
print('Request timed out')
#捕獲 HTTP 錯(cuò)誤 (如狀態(tài)碼 404、500 等)
except HTTPError as http_err:
print(f'HTTP error occurred: {http_err}')
#捕獲其他網(wǎng)絡(luò)相關(guān)的錯(cuò)誤
except RequestException as req_err:
print(f'Request error occurred: {req_err}')
#可以在 finally 塊中清理資源 (如關(guān)閉文件或連接)
finally:
print('Request attempt completed.')代碼解釋?zhuān)?nbsp;
- try 塊:首先發(fā)起 HTTP 請(qǐng)求,設(shè)置超時(shí)時(shí)間為 5 秒,并使用 response.raise_for_status () 來(lái)檢查響應(yīng)的狀態(tài)碼。如果服務(wù)器返回了錯(cuò)誤的狀態(tài)碼 (如 404、500), raise_for_status () 會(huì)拋出 HTTPError 異常。
- except 塊:
- Timeout: 如果請(qǐng)求超時(shí) (超過(guò)設(shè)置的 5 秒), 程序會(huì)捕獲到 Timeout 異常,并打印 “Request timed out”。
- HTTPError: 如果響應(yīng)的狀態(tài)碼表明出現(xiàn) HTTP 錯(cuò)誤 (例如 404 表示未找到頁(yè)面), 程序會(huì)捕獲到 HTTPError 異常,并打印相關(guān)錯(cuò)誤信息。
- RequestException: 捕獲其他類(lèi)型的網(wǎng)絡(luò)相關(guān)錯(cuò)誤 (如連接問(wèn)題、DNS 解析失敗等)。RequestException 是所有 requests 庫(kù)異常的基類(lèi),可以捕獲任何 requests 庫(kù)拋出的異常。
- finally 塊: finally 中的代碼無(wú)論是否發(fā)生異常都會(huì)被執(zhí)行,通常用于釋放資源或做一些收尾工作。”Request attempt completed“ 表示請(qǐng)求結(jié)束
常見(jiàn)問(wèn)題解決方案
| 問(wèn)題 | 解決方案 | 代碼示例 |
|---|---|---|
| 數(shù)據(jù)庫(kù)連接泄漏 | 使用 contextlib 管理連接 | with database_connection() as conn: |
| CSRF/XSS攻擊 | 啟用框架內(nèi)置保護(hù)(如Django的csrf_token) | <form>{% csrf_token %}</form> |
| 文件上傳超限 | 捕獲 RequestEntityTooLarge 異常 | except RequestEntityTooLarge: ... |
| 第三方API超時(shí) | 設(shè)置超時(shí) + 重試機(jī)制 | requests.get(url, timeout=5) |
總結(jié)
| 場(chǎng)景 | 工具/方法 |
|---|---|
| 代碼塊級(jí)錯(cuò)誤處理 | try-except + 具體異常類(lèi)型捕獲 |
| 全局異常統(tǒng)一響應(yīng) | 框架錯(cuò)誤處理器(如 @errorhandler) |
| 自定義錯(cuò)誤類(lèi)型 | 繼承 Exception 定義業(yè)務(wù)異常類(lèi) |
| 日志記錄 | logging 模塊記錄堆棧信息 |
| 異步錯(cuò)誤處理 | asyncio 任務(wù) + 異?;卣{(diào) |
到此這篇關(guān)于Python中web錯(cuò)誤處理與異常捕獲的文章就介紹到這了,更多相關(guān)Python web錯(cuò)誤處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Jupyter Notebook調(diào)用指定的虛擬環(huán)境的實(shí)現(xiàn)示例
本文主要介紹了Jupyter Notebook調(diào)用指定的虛擬環(huán)境的實(shí)現(xiàn)示例,,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
Python黑魔法Descriptor描述符的實(shí)例解析
與迭代器和裝飾器等一樣,描述符也是Python編程中的一項(xiàng)高級(jí)技巧,這里我們就來(lái)講解Python黑魔法Descriptor描述符的實(shí)例解析:2016-06-06
Pandas中的unique()和nunique()區(qū)別詳解
Pandas中Series和DataFrame的兩種數(shù)據(jù)類(lèi)型中都有nunique()和unique()方法,本文詳細(xì)的介紹了兩者的區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下2022-08-08
python打開(kāi)windows應(yīng)用程序的實(shí)例
今天小編就為大家分享一篇python打開(kāi)windows應(yīng)用程序的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06
Pytorch實(shí)現(xiàn)Fashion-mnist分類(lèi)任務(wù)全過(guò)程
這篇文章主要介紹了Pytorch實(shí)現(xiàn)Fashion-mnist分類(lèi)任務(wù)全過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
python 等差數(shù)列末項(xiàng)計(jì)算方式
這篇文章主要介紹了python 等差數(shù)列末項(xiàng)計(jì)算方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05
python單例設(shè)計(jì)模式實(shí)現(xiàn)解析
這篇文章主要介紹了python單例設(shè)計(jì)模式實(shí)現(xiàn)解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01

