当前位置: 代码网 > it编程>前端脚本>Python > Python中web错误处理与异常捕获示例详解

Python中web错误处理与异常捕获示例详解

2025年07月11日 Python 我要评论
一、概述在 web 开发中,错误处理与异常捕获是保障服务稳定性和用户体验的核心机制:核心目标:防止服务崩溃:捕获未处理的异常,避免因单个请求错误导致整个服务不可用。友好用户提示:向客户端返回有意义的错

一、概述

在 web 开发中,错误处理与异常捕获是保障服务稳定性和用户体验的核心机制:

  • 核心目标

    • 防止服务崩溃:捕获未处理的异常,避免因单个请求错误导致整个服务不可用。

    • 友好用户提示:向客户端返回有意义的错误信息(如 404 页面、500 错误页)。

    • 日志记录:记录异常堆栈信息,便于调试和问题追踪。

  • 常见场景

    • 数据库操作失败(如连接超时、sql 语法错误)。

    • 外部 api 调用异常(如网络中断、响应格式错误)。

    • 用户输入校验失败(如参数缺失、类型不匹配)。

  • http 错误码关联

    • 4xx:客户端错误(如 400 bad request404 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.')

代码解释: 

  1. try 块:首先发起 http 请求,设置超时时间为 5 秒,并使用 response.raise_for_status () 来检查响应的状态码。如果服务器返回了错误的状态码 (如 404、500), raise_for_status () 会抛出 httperror 异常。
  2. except 块:
    • timeout: 如果请求超时 (超过设置的 5 秒), 程序会捕获到 timeout 异常,并打印 “request timed out”。
    • httperror: 如果响应的状态码表明出现 http 错误 (例如 404 表示未找到页面), 程序会捕获到 httperror 异常,并打印相关错误信息。
    • requestexception: 捕获其他类型的网络相关错误 (如连接问题、dns 解析失败等)。requestexception 是所有 requests 库异常的基类,可以捕获任何 requests 库抛出的异常。
  3. 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错误处理内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com