前言
一、异常处理的基本语法
1、基础结构:
2、多异常捕获
3、else 和 finally 块
二、常见内置异常类型
三、相关函数与关键字
1、raise:
2、assert:
3、自定义异常类
4、sys.exc_info()
5、traceback 模块
四、进阶用法与示例
1、异常链(Python 3+)
2、上下文管理器自动处理资源
3、日志记录异常
4、处理文件操作异常
最近在学习Python,将所学内容整理成文章,以便以后翻阅和复习,同时分享给大家。有问题欢迎随时指正。
异常处理机制(Exception Handling)捕获和处理运行时错误,防止程序崩溃。异常是程序执行期间发生的错误事件(如除以零、文件未找到等),是管理程序运行时错误的核心机制。通过合理的异常处理,可以增强代码的健壮性,避免程序因意外错误而崩溃。
try
+ except
try:
# 可能引发异常的代码
result = 10 / 0
except ZeroDivisionError:
print("捕获到除零错误!")
try:
x = int(input("请输入数字: "))
print(10 / x)
except ValueError:
print("输入无效,非整数!")
except ZeroDivisionError:
print("除数不能为零!")
except Exception as e: # 捕获其他所有异常
print(f"未知错误: {e}")
else
和 finally
块try:
print("尝试执行代码...")
except Exception as e:
print(f"错误: {e}")
else:
print("无异常时执行此处")
finally:
print("无论是否异常,最终执行此处(如释放资源)")
ValueError
:值错误(如将字符串转换为非数字)
TypeError
:类型错误(如对数字和字符串进行加法)
IndexError
:索引越界
KeyError
:字典键不存在
FileNotFoundError
:文件未找到
ZeroDivisionError
:除数为零
Exception
:所有异常的基类
1、raise
:手动抛出异常
def check_age(age):
if age < 0:
raise ValueError("年龄不能为负数!")
try:
check_age(-5)
except ValueError as e:
print(e)
assert
:断言条件
def calculate_average(numbers):
assert len(numbers) > 0, "列表不能为空"
return sum(numbers) / len(numbers)
try:
avg = calculate_average([])
except AssertionError as e:
print(f"断言失败: {e}")
class MyCustomError(Exception):
def __init__(self, message, code):
super().__init__(message)
self.code = code
try:
raise MyCustomError("自定义错误", 1001)
except MyCustomError as e:
print(f"错误代码: {e.code}, 信息: {e}")
sys.exc_info()
获取异常详情
import sys
try:
raise TypeError("类型错误示例")
except:
exc_type, exc_value, exc_traceback = sys.exc_info()
print(f"异常类型: {exc_type}, 信息: {exc_value}")
traceback
模块打印完整堆栈
import traceback
try:
open("不存在的文件.txt")
except FileNotFoundError:
traceback.print_exc() # 输出详细错误位置
def read_file(filename):
try:
with open(filename) as f:
return f.read()
except FileNotFoundError as e:
raise ValueError("文件读取失败") from e # 保留原始异常
try:
read_file("missing.txt")
except ValueError as e:
print(f"最终错误: {e}")
print(f"原始错误: {e.__cause__}")
with open("data.txt", "r") as f:
try:
content = f.read()
except UnicodeDecodeError:
print("文件编码错误!")
import logging
logging.basicConfig(level=logging.ERROR)
try:
x = 1 / 0
except Exception as e:
logging.error(f"运行时错误: {e}", exc_info=True) # 记录详细日志
try:
with open("nonexistent_file.txt", "r") as f:
content = f.read()
except FileNotFoundError:
print("文件未找到!")
except Exception as e:
print(f"未知错误:{e}")
else:
print("文件内容:", content)