news 2026/4/12 14:48:29

12.Python异常

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
12.Python异常

Python异常处理完全指南:从基础语法到高级技巧

异常处理是Python编程中至关重要的概念,它允许程序在遇到错误时优雅地恢复或提供有用的错误信息。本文将基于提供的代码文档,全面讲解Python异常处理的核心机制和最佳实践。

1. 常见的Python异常类型

1.1 基础运算异常

# ZeroDivisionError: 除数为零 result = 10 / 0 # 错误:不能除以零 # NameError: 变量未定义 print(x) # 错误:变量x未声明 # AttributeError: 对象没有该属性 print(len(x)) # 错误:x没有len()方法

1.2 类型与值异常

# TypeError: 类型错误 print(len(10)) # 错误:整数没有长度 # ValueError: 值错误 print(int('a')) # 错误:'a'无法转换为整数 # IndexError: 索引越界 print(x[10]) # 错误:列表索引超出范围

1.3 容器与系统异常

# KeyError: 字典键不存在 print(dict(a=1)['b']) # 错误:键'b'不存在 # OverflowError: 数值溢出 print(2 ** 1000) # 大数计算可能溢出 # MemoryError: 内存不足 while True: print(1) # 无限循环导致内存耗尽

1.4 文件操作异常

# FileNotFoundError: 文件不存在 with open('my_file.txt', 'r') as f: print(f.read()) # 错误:文件不存在 # IOError: 输入输出错误 with open('my_file.txt', 'w') as f: f.write('Hello World') # 可能因权限等问题失败 # OSError: 操作系统错误 import os os.mkdir('my_dir') # 创建目录可能失败 os.remove('my_file.txt') # 删除文件可能失败

2. 基础异常处理语法

2.1 try-except基本结构

try: # 尝试执行的代码块 result = 10 / 0 except ZeroDivisionError: # 当发生ZeroDivisionError时执行 print("不能除以零!")

2.2 多异常捕获

try: result = 10 / int(input("请输入一个数字: ")) except ValueError: print("输入的不是一个有效的数字!") except ZeroDivisionError: print("不能除以零!")

3. 完整的异常处理流程

3.1 使用else子句

try: result = 10 / int(input("请输入一个数字: ")) except ValueError: print("输入的不是一个有效的数字!") except ZeroDivisionError: print("不能除以零!") else: # 只有当try块成功执行时才运行 print("结果是:", result)

3.2 使用finally子句

try: result = 10 / int(input("请输入一个数字: ")) except ValueError: print("输入的不是一个有效的数字!") except ZeroDivisionError: print("不能除以零!") finally: # 无论是否发生异常都会执行 print("操作完成。")

4. 高级异常处理技巧

4.1 异常的捕获和重新抛出

try: result = 10 / int(input("请输入一个数字: ")) except ValueError as e: print("输入的不是一个有效的数字!") raise # 重新抛出原始异常 except ZeroDivisionError as e: print("不能除以零!") raise e # 重新抛出捕获的异常

4.2 获取异常信息

try: result = 10 / int(input("请输入一个数字: ")) except Exception as e: print(f"发生错误: {type(e).__name__}") print(f"错误信息: {e}")

5. 实际应用场景

5.1 文件操作异常处理

try: with open('config.txt', 'r') as f: content = f.read() except FileNotFoundError: print("配置文件不存在,使用默认配置") except PermissionError: print("没有文件读取权限") except IOError as e: print(f"文件读取错误: {e}")

5.2 网络请求异常处理

import requests try: response = requests.get('https://api.example.com/data', timeout=5) response.raise_for_status() # 如果HTTP请求返回不成功的状态码,则抛出异常 data = response.json() except requests.exceptions.Timeout: print("请求超时") except requests.exceptions.ConnectionError: print("网络连接错误") except requests.exceptions.HTTPError as e: print(f"HTTP错误: {e.response.status_code}") except ValueError: print("响应内容不是有效的JSON")

5.3 数据库操作异常处理

import sqlite3 try: conn = sqlite3.connect('database.db') cursor = conn.cursor() cursor.execute("SELECT * FROM users WHERE id = ?", (user_id,)) user = cursor.fetchone() except sqlite3.OperationalError as e: print(f"数据库操作错误: {e}") except sqlite3.IntegrityError: print("数据完整性错误") finally: if 'conn' in locals(): conn.close() # 确保数据库连接关闭

6. 自定义异常类

class ValidationError(Exception): """自定义验证异常""" def __init__(self, message, field=None): self.message = message self.field = field super().__init__(self.message) def validate_age(age): if not isinstance(age, int): raise ValidationError("年龄必须是整数", "age") if age < 0 or age > 150: raise ValidationError("年龄必须在0-150之间", "age") # 使用自定义异常 try: validate_age(-5) except ValidationError as e: print(f"验证错误: {e.message} (字段: {e.field})")

7. 最佳实践总结

  1. 精确捕获异常:避免使用裸露的except:,应该捕获具体的异常类型

  2. 提供有用的错误信息:帮助用户理解问题所在

  3. 资源清理:使用finally或上下文管理器确保资源正确释放

  4. 异常链:在重新抛出异常时保留原始堆栈信息

  5. 日志记录:在生产环境中应该记录异常而非直接打印

import logging try: # 业务代码 result = risky_operation() except Exception as e: logging.error("操作失败", exc_info=True) # 给用户的友好提示 print("操作失败,请稍后重试")

结语

异常处理是编写健壮Python应用程序的关键。通过合理使用try-except结构、正确捕获特定异常类型、实现资源清理机制,可以显著提高程序的稳定性和用户体验。掌握这些异常处理技巧,将使你能够编写出更加专业和可靠的Python代码。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/11 22:09:19

Python入门:从安装到第一个程序

好的&#xff0c;我们来梳理一下Python的基础与环境配置要点&#xff1a; 1. Python 是什么&#xff1f; Python 是一种高级编程语言&#xff0c;以简洁易读的语法著称。它支持多种编程范式&#xff08;面向对象、函数式等&#xff09;&#xff0c;广泛应用于数据分析、人工智…

作者头像 李华
网站建设 2026/4/11 7:37:16

RanUI:一款回归纯粹的高性能PHP博客/内容管理系统

RanUI&#xff1a;一款回归纯粹的高性能PHP博客/内容管理系统 在追求速度与极简的今天&#xff0c;你是否已经厌倦了臃肿、复杂&#xff0c;动辄加载数秒的CMS系统&#xff1f;对于真正专注于内容创作的博主和开发者而言&#xff0c;一个响应迅速、核心纯净、但又具备足够扩展…

作者头像 李华
网站建设 2026/3/28 18:57:56

安卓驱动开发工程师:深入技术核心,驱动智能未来

深圳达实智能股份有限公司 安卓驱动开发工程师 职位信息 负责安卓系统底层驱动的设计、开发、调试、集成与性能优化工作。 负责Android Framework及内核等系统框架层的调优,关键模块开发实现及调试定位。 系统API设计和开发,安卓SDK定制和维护。 二、 任职要求: 1. 基础要求…

作者头像 李华
网站建设 2026/3/26 13:08:33

协鑫集成高级AI开发工程师职位深度解析:职责、能力与面试指南

协鑫集成 高级AI开发工程师 职位信息 职位详情: 1.探索、跟踪国内外领先的AI技术、产品方案,推动其在公司内应用,提升企业运营效率,生产效率。 2.协调各部门团队,包括研发、工艺、生产、职能等,确保AI项目目标实现。 3.结合AI背景和行业需求,为企业数字化、智能化提供指…

作者头像 李华
网站建设 2026/4/1 3:41:03

Snapd和Apt—Linux 上两种完全不同的软件包管理系统

Snapd 和 Apt 是 Linux 上两种完全不同的软件包管理系统&#xff0c;各有优劣。以下是详细对比&#xff1a; 核心区别一览 特性Apt (传统)Snapd (现代)设计年代1998年 (Debian)2014年 (Ubuntu)软件包格式.deb.snap依赖处理共享系统库&#xff0c;自动解决依赖自带所有依赖&…

作者头像 李华
网站建设 2026/4/7 14:49:47

ESP32 的宝藏开源项目:ESP32 - Bus - Pirate 打造硬件调试瑞士军刀

大家好&#xff0c;我是杂烩君。当你手里拿着一个ESP32开发板&#xff0c;除了做物联网项目&#xff0c;还能干什么&#xff1f; 可以借助ESP32-Bus-Pirate把ESP32板子变成了一把"瑞士军刀"&#xff0c;能够与20多种数字协议和无线协议进行交互。 1. ESP32-Bus-Pir…

作者头像 李华