一、概述
在 web 开发中,错误处理与异常捕获是保障服务稳定性和用户体验的核心机制:
核心目标:
防止服务崩溃:捕获未处理的异常,避免因单个请求错误导致整个服务不可用。
友好用户提示:向客户端返回有意义的错误信息(如 404 页面、500 错误页)。
日志记录:记录异常堆栈信息,便于调试和问题追踪。
常见场景:
数据库操作失败(如连接超时、sql 语法错误)。
外部 api 调用异常(如网络中断、响应格式错误)。
用户输入校验失败(如参数缺失、类型不匹配)。
http 错误码关联:
4xx:客户端错误(如400 bad request、404 not found)。5xx:服务端错误(如500 internal server error)。
核心原则
防崩溃:捕获所有未处理异常,避免服务中断。
明日志:记录异常堆栈,便于调试。
友好响应:返回用户易懂的错误信息,隐藏敏感细节。
二、try 语句
try 语句是 python 中处理异常的基础工具,在 web 开发中用于保护可能出错的代码块。
1.基础语法
try:
# 可能引发异常的代码(如数据库操作、文件读写)
risky_operation()
except exceptiontype as e:
# 捕获特定异常并处理
handle_error(e)
else:
# 无异常时执行(可选)
clean_up()
finally:
# 无论是否异常都执行(如释放资源)
release_resources() | 代码块 | 用途 | 执行条件 | 最佳实践 |
|---|---|---|---|
try | 包裹可能引发异常的代码 | 总是执行 | 仅包含可能出错的代码,避免冗余逻辑。 |
except | 捕获并处理特定异常 | 当 try 块发生异常时 | 优先捕获具体异常类型,避免裸露的 except。 |
else | 执行无异常时的后续逻辑 | try 块无异常时执行 | 用于分离正常流程和异常处理代码。 |
finally | 无论是否异常都执行的清理操作 | 总是执行 | 释放资源(如关闭文件、数据库连接)。 |
常见异常类型
| 异常 | 触发场景 |
|---|---|
filenotfounderror | 文件不存在时尝试读取(如 open("r"))。 |
permissionerror | 无权限访问文件(如只读文件尝试写入)。 |
isadirectoryerror | 尝试以文件模式操作目录。 |
unicodedecodeerror | 文本文件编码不匹配(如用 utf-8 读取 gbk 文件)。 |
一句话总结
try 防崩溃,except 抓异常,else 走正路,finally 清战场。
2. 示例:捕获常见异常
import requests
from requests.exceptions import requestexception, timeout, httperror
try:
#发送 get 请求,并设置超时时间为 5 秒
response = requests.get('https://www.example.com', timeout=5)
#如果状态码不是 200, 抛出 httperror 异常
response.raise_for_status () # 如果状态码是 404 或 500, 抛出异常
#如果请求成功,则输出响应内容
print('response body:', response.text)
#捕获请求超时异常
except timeout:
print('request timed out')
#捕获 http 错误 (如状态码 404、500 等)
except httperror as http_err:
print(f'http error occurred: {http_err}')
#捕获其他网络相关的错误
except requestexception as req_err:
print(f'request error occurred: {req_err}')
#可以在 finally 块中清理资源 (如关闭文件或连接)
finally:
print('request attempt completed.')代码解释:
- try 块:首先发起 http 请求,设置超时时间为 5 秒,并使用 response.raise_for_status () 来检查响应的状态码。如果服务器返回了错误的状态码 (如 404、500), raise_for_status () 会抛出 httperror 异常。
- except 块:
- timeout: 如果请求超时 (超过设置的 5 秒), 程序会捕获到 timeout 异常,并打印 “request timed out”。
- httperror: 如果响应的状态码表明出现 http 错误 (例如 404 表示未找到页面), 程序会捕获到 httperror 异常,并打印相关错误信息。
- requestexception: 捕获其他类型的网络相关错误 (如连接问题、dns 解析失败等)。requestexception 是所有 requests 库异常的基类,可以捕获任何 requests 库抛出的异常。
- finally 块: finally 中的代码无论是否发生异常都会被执行,通常用于释放资源或做一些收尾工作。”request attempt completed“ 表示请求结束
常见问题解决方案
| 问题 | 解决方案 | 代码示例 |
|---|---|---|
| 数据库连接泄漏 | 使用 contextlib 管理连接 | with database_connection() as conn: |
| csrf/xss攻击 | 启用框架内置保护(如django的csrf_token) | <form>{% csrf_token %}</form> |
| 文件上传超限 | 捕获 requestentitytoolarge 异常 | except requestentitytoolarge: ... |
| 第三方api超时 | 设置超时 + 重试机制 | requests.get(url, timeout=5) |
总结
| 场景 | 工具/方法 |
|---|---|
| 代码块级错误处理 | try-except + 具体异常类型捕获 |
| 全局异常统一响应 | 框架错误处理器(如 @errorhandler) |
| 自定义错误类型 | 继承 exception 定义业务异常类 |
| 日志记录 | logging 模块记录堆栈信息 |
| 异步错误处理 | asyncio 任务 + 异常回调 |
到此这篇关于python中web错误处理与异常捕获的文章就介绍到这了,更多相关python web错误处理内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论