Appearance
第14章:异常处理
14.1 异常的概念
异常是程序运行时出现的错误,如语法错误、索引错误、文件不存在错误等,这些错误会导致程序崩溃。异常处理是一种机制,用于捕获和处理这些错误,使程序能够继续运行,而不是直接崩溃。
- 异常的类型:
- 语法错误:代码语法不正确,在编译时就会被发现
- 运行时错误:代码语法正确,但在运行时出现错误,如除以零、访问不存在的索引等
- 逻辑错误:代码语法正确,运行时也不报错,但结果不符合预期
14.2 异常处理的作用
异常处理的主要作用包括:
- 避免程序崩溃:捕获异常后,程序可以继续执行,而不是直接终止
- 提供错误信息:可以向用户显示友好的错误信息,而不是晦涩的错误堆栈
- 资源清理:确保无论是否发生异常,资源都能被正确释放
- 提高程序健壮性:使程序能够处理各种异常情况,提高用户体验
14.3 异常处理语法
基础语法
python
try:
# 可能出现异常的代码
代码1
代码2
...
except 异常类型:
# 异常处理代码
代码1
代码2
...捕获所有异常
python
try:
# 可能出现异常的代码
except Exception:
# 捕获所有未指定的异常
print("发生了异常")多异常捕获
python
try:
# 可能出现异常的代码
except (异常类型1, 异常类型2):
# 捕获多种指定异常
print("发生了指定的异常")finally语句
finally语句无论是否出现异常,都会执行,通常用于关闭文件、释放资源等操作。
python
try:
# 可能出现异常的代码
except Exception:
# 异常处理代码
finally:
# 无论是否出现异常,都会执行的代码
print("清理资源")else语句
else语句在没有出现异常时执行。
python
try:
# 可能出现异常的代码
except Exception:
# 异常处理代码
else:
# 没有出现异常时执行的代码
print("执行成功")14.4 常见异常类型
Python中有许多内置的异常类型,以下是一些常见的异常类型:
| 异常类型 | 描述 |
|---|---|
IndexError | 索引越界异常 |
KeyError | 字典访问不存在的键异常 |
FileNotFoundError | 文件不存在异常 |
ValueError | 值错误 |
TypeError | 类型错误 |
ZeroDivisionError | 除以零异常 |
AttributeError | 属性错误 |
NameError | 名称错误 |
SyntaxError | 语法错误 |
实操案例:捕获文件不存在异常
案例:捕获文件不存在异常
python
def read_file(filename):
"""读取文件内容,捕获文件不存在异常"""
try:
with open(filename, "r", encoding="utf-8") as f:
content = f.read()
print(f"文件内容:\n{content}")
except FileNotFoundError:
print(f"错误:文件{filename}不存在!")
except Exception as e:
print(f"错误:{e}")
finally:
print("文件操作完成")
# 测试
read_file("test.txt") # 假设文件不存在
read_file("existing_file.txt") # 假设文件存在运行结果
错误:文件test.txt不存在!
文件操作完成
文件内容:
Hello, Python!
Welcome to exception handling.
文件操作完成实操案例:捕获索引越界异常
案例:捕获索引越界异常
python
def get_element(lst, index):
"""获取列表元素,捕获索引越界异常"""
try:
element = lst[index]
print(f"索引{index}处的元素是:{element}")
return element
except IndexError:
print(f"错误:索引{index}超出列表范围!")
return None
# 测试
numbers = [1, 2, 3, 4, 5]
get_element(numbers, 2) # 正常访问
get_element(numbers, 10) # 索引越界
get_element(numbers, -6) # 负索引越界运行结果
索引2处的元素是:3
错误:索引10超出列表范围!
错误:索引-6超出列表范围!实操案例:捕获用户输入错误异常
案例:捕获用户输入错误异常
python
def get_age():
"""获取用户年龄,捕获输入错误异常"""
while True:
try:
age = int(input("请输入你的年龄:"))
if age < 0 or age > 150:
raise ValueError("年龄必须在0-150之间")
print(f"你今年{age}岁")
return age
except ValueError as e:
print(f"输入错误:{e}")
print("请重新输入")
# 测试
age = get_age()
print(f"获取到的年龄:{age}")运行结果
请输入你的年龄:abc
输入错误:invalid literal for int() with base 10: 'abc'
请重新输入
请输入你的年龄:200
输入错误:年龄必须在0-150之间
请重新输入
请输入你的年龄:25
你今年25岁
获取到的年龄:25新手易错点
捕获异常过于宽泛:
- 不指定具体异常类型,使用
except Exception:捕获所有异常 - 这会掩盖真正的错误原因,不利于调试
- 建议只捕获预期的异常类型
- 不指定具体异常类型,使用
finally语句使用错误:
- 在finally语句中使用return语句,会覆盖try或except中的return值
- finally语句应该只用于清理资源,不应该包含业务逻辑
未处理关键异常:
- 忽略异常处理,导致程序在遇到异常时直接崩溃
- 应该捕获并处理可能出现的异常,提高程序的健壮性
异常处理嵌套过深:
- 多层嵌套的try-except语句,使代码难以阅读和维护
- 应该合理设计代码结构,减少异常处理的嵌套层次
通过本章的学习,你已经掌握了Python中异常处理的基本方法。异常处理是Python编程中的重要内容,它可以帮助你编写更加健壮的程序,提高用户体验。在实际编程中,你应该合理使用异常处理,捕获和处理可能出现的异常,同时避免过度使用异常处理影响代码的可读性和性能。
