今日目标:
- 理解什么是异常以及为什么需要处理异常。
- 学习使用try-except块捕获和处理异常。
- 学习使用else和finally子句。
- 了解常见的异常类型。
- 学习如何抛出异常(使用raise)。
第一部分:为什么需要异常处理?
在程序运行过程中,可能会遇到各种错误,列如:
- 文件不存在
- 除以零
- 类型错误
- 索引越界
如果没有异常处理,这些错误会导致程序崩溃。异常处理可以让程序在遇到错误时优雅地处理,而不是直接崩溃。
- 异常示例:
# 创建新文件 day12_exception.py
# 除以零错误
# result = 10 / 0 # 这会引发ZeroDivisionError
# 文件不存在错误
# file = open('nonexistent.txt', 'r') # 会引发FileNotFoundError
# 类型错误
# number = int("abc") # 会引发ValueError
第二部分:基本的异常处理
2 使用try-except块:
# 捕获特定异常
try:
number = int(input("请输入一个整数:"))
result = 10 / number
print(f"10除以{number}的结果是:{result}")
except ZeroDivisionError:
print("错误:除数不能为零!")
except ValueError:
print("错误:请输入一个有效的整数!")
3 捕获多个异常:
# 使用不指定异常类型的except可以捕获所有异常,但不推荐
try:
# 可能出错的代码
number = int(input("请输入一个整数:"))
result = 10 / number
except:
print("发生了某种错误!")
4 捕获所有异常:
# 使用不指定异常类型的except可以捕获所有异常,但不推荐
try:
# 可能出错的代码
number = int(input("请输入一个整数:"))
result = 10 / number
except:
print("发生了某种错误!")
第三部分:else和finally子句
5 else子句:
# 如果没有发生异常,则执行else块
try:
number = int(input("请输入一个整数:"))
result = 10 / number
except (ZeroDivisionError, ValueError):
print("输入有误!")
else:
print(f"计算成功,结果是:{result}")
6 finally子句:
# 无论是否发生异常,finally块都会执行
try:
file = open('example.txt', 'r')
content = file.read()
number = int(content)
except (FileNotFoundError, ValueError) as e:
print(f"错误:{e}")
finally:
# 一般用于释放资源,如关闭文件
if 'file' in locals():
file.close()
print("资源清理完成。")
第四部分:常见的异常类型
7 Python中常见的异常:
- ZeroDivisionError:除以零
- ValueError:值错误,如int('abc')
- TypeError:类型错误,如 '2' + 2
- IndexError:索引越界
- KeyError:字典键不存在
- FileNotFoundError:文件不存在
- ImportError:导入模块失败
# 示例:处理多种常见异常
try:
# 可能引发多种异常
number = int(input("请输入一个整数:"))
result = 10 / number
my_list = [1, 2, 3]
print(my_list[number])
except ZeroDivisionError:
print("除数不能为零!")
except ValueError:
print("请输入有效的整数!")
except IndexError:
print("索引越界!")
第五部分:抛出异常
有时我们想主动抛出异常,可以使用raise语句。
8 使用raise抛出异常:
# 检查输入年龄的合理性
age = int(input("请输入年龄:"))
if age < 0 or age > 150:
raise ValueError("年龄必须在0到150之间")
else:
print(f"年龄是:{age}")
9 自定义异常:
# 创建自定义异常类
class MyCustomError(Exception):
pass
# 使用自定义异常
def check_positive(number):
if number < 0:
raise MyCustomError("数字必须是正数")
return number
try:
check_positive(-5)
except MyCustomError as e:
print(f"自定义错误:{e}")
第六部分:异常处理的最佳实践
10 异常处理的原则:
- 只捕获你知道如何处理的异常
- 避免使用空的except块(这会捕获所有异常,包括键盘中断等)
- 尽量指定具体的异常类型
- 使用finally块来释放资源
- 在日志中记录异常信息,而不仅仅是打印
# 好的实践
try:
# 可能出错的代码
with open('data.txt', 'r') as file:
data = file.read()
except FileNotFoundError:
print("文件不存在,将使用默认数据")
data = "默认数据"
except IOError as e:
print(f"文件读取错误:{e}")
else:
print("文件读取成功")
今日小结与练习
今日核心概念:
- 异常: 程序运行过程中出现的错误
- try-except: 捕获和处理异常
- else: 没有异常时执行的代码
- finally: 无论是否异常都会执行的代码,用于清理资源
- raise: 主动抛出异常
- 自定义异常: 创建自己的异常类
动手练习(务必完成):
练习1:安全的计算器
改善之前的计算器程序,添加异常处理,确保在输入无效时程序不会崩溃。
要求:
- 处理除以零错误
- 处理非数字输入错误
- 让用户有机会重新输入,直到输入正确
示例:
请输入第一个数字:abc
错误:请输入有效的数字!
请输入第一个数字:10
请输入第二个数字:0
错误:除数不能为零!
请输入第二个数字:5
10 / 5 = 2
练习2:文件读取安全版
编写一个程序,要求用户输入文件名,然后读取文件内容。如果文件不存在,提示用户重新输入,直到输入有效的文件名。
示例:
请输入文件名:wrong.txt
文件不存在,请重新输入!
请输入文件名:example.txt
文件内容:...
练习3(挑战):用户注册验证
编写一个用户注册程序,要求用户输入用户名和密码,并进行验证:
- 用户名长度至少3个字符
- 密码长度至少8个字符
- 如果验证失败,抛出自定义异常,并捕获显示给用户
示例:
请输入用户名:ab
错误:用户名必须至少3个字符!
请输入用户名:abc
请输入密码:123
错误:密码必须至少8个字符!
异常处理是编写健壮程序的关键,今天的内容超级重大。多练习,掌握各种异常处理技巧!
第十二天完成,你的程序目前更加健壮了!
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...
