【成人版python基础入门】第三章 异常处理——给未知一个拥抱
异常处理——给未知一个拥抱
在编程的旅途中,遇到错误是常有的事。无论是疏忽大意还是不可预见的情况,错误都会时不时地出现。但是,不要害怕!Python 提供了强大的异常处理机制,让你可以优雅地处理这些“小惊喜”。通过学习异常处理,你可以确保程序在遇到问题时依然能够正常运行,而不是戛然而止。
什么是异常
在计算机科学中,异常是指程序在运行过程中出现的错误或意外情况。当程序遇到异常时,会停止正常执行,并抛出一个异常对象。如果异常没有被捕获,程序会崩溃并显示错误信息。
风趣的例子
假设你是一位勇敢的探险家,正在探索一片未知的森林。森林中充满了各种未知的危险,如陷阱、迷雾、野兽等。如果你不小心掉进陷阱,那么探险就会中止。但是,如果你事先准备了一根绳子,就可以在掉进陷阱后爬出来,继续探索。
在编程中,异常就像是探险中的陷阱,而异常处理机制就是那根绳子,帮助你爬出陷阱,继续前进。
程序中可能出现的各种错误
- 文件不存在:尝试打开一个不存在的文件。
- 权限问题:没有足够的权限读取或写入文件。
- 类型错误:变量类型不匹配,如将字符串与整数相加。
- 索引超出范围:访问列表或字符串的索引时,索引值超过了范围。
- 除以零:尝试进行除以零的运算。
- 格式错误:输入或输出的格式不符合预期。
- 网络连接问题:尝试连接网络时,网络不可用或连接失败。
这些错误就像是你在编程过程中遇到的各种小怪物,需要你用异常处理机制来驯服它们。
try
-except
语句
什么是 try
-except
语句
try
-except
语句是 Python 中用于捕获和处理异常的结构。try
块中放置可能会抛出异常的代码,except
块中放置处理异常的代码。如果 try
块中的代码抛出异常,程序会跳转到 except
块中执行。
基本语法
try:
# 可能会抛出异常的代码
risky_code()
except ExceptionType:
# 处理异常的代码
handle_exception()
例子:处理除以零的异常
假设你编写了一个简单的程序,用于计算两个数的商。如果用户尝试将一个数除以零,程序会抛出 ZeroDivisionError
异常。我们可以使用 try
-except
语句来捕获和处理这个异常。
def divide_numbers(a, b):
try:
result = a / b
print(f"{a} 除以 {b} 的结果是: {result}")
except ZeroDivisionError:
print("除数不能为零,请重新输入。")
# 测试
divide_numbers(10, 2) # 输出:10 除以 2 的结果是: 5.0
divide_numbers(10, 0) # 输出:除数不能为零,请重新输入。
在这个例子中,如果 b
为零,a / b
会抛出 ZeroDivisionError
异常。except
块中的代码会捕获这个异常,并提示用户重新输入。
常见异常类型
FileNotFoundError
当尝试打开一个不存在的文件时,会抛出 FileNotFoundError
异常。
try:
with open("nonexistent_file.txt", "r") as file:
content = file.read()
print(content)
except FileNotFoundError:
print("文件不存在,请检查文件名和路径。")
PermissionError
当尝试访问一个没有权限的文件时,会抛出 PermissionError
异常。
try:
with open("protected_file.txt", "r") as file:
content = file.read()
print(content)
except PermissionError:
print("没有权限读取文件,请检查文件权限。")
TypeError
当变量类型不匹配时,会抛出 TypeError
异常。
try:
a = 10
b = "2"
result = a + b
except TypeError:
print("类型错误,不能将整数与字符串相加。")
IndexError
当访问列表或字符串的索引超出范围时,会抛出 IndexError
异常。
try:
my_list = [1, 2, 3]
print(my_list[3])
except IndexError:
print("索引超出范围。")
ValueError
当传递的参数不符合函数的预期时,会抛出 ValueError
异常。
try:
number = int("abc")
except ValueError:
print("格式错误,不能将 'abc' 转换为整数。")
IOError
当发生输入/输出错误时,会抛出 IOError
异常。在 Python 3 中,IOError
被 OSError
取代,但 OSError
也可以处理类似的错误。
try:
with open("diary.txt", "r") as file:
content = file.read()
print(content)
except OSError:
print("发生输入/输出错误。")
KeyError
当访问字典中不存在的键时,会抛出 KeyError
异常。
try:
my_dict = {"apple": 5, "banana": 3}
print(my_dict["orange"])
except KeyError:
print("字典中没有 'orange' 这个键。")
处理多种异常
一个 except
块处理多种异常
你可以在一个 except
块中处理多种异常类型,方法是将它们放在一个元组中。
try:
with open("diary.txt", "r") as file:
content = file.read()
print(content)
except (FileNotFoundError, PermissionError, OSError) as e:
print(f"发生错误: {e}")
多个 except
块
你也可以为每种异常类型单独编写一个 except
块,这样可以更精确地处理不同的错误。
try:
with open("diary.txt", "r") as file:
content = file.read()
print(content)
except FileNotFoundError:
print("文件不存在,请检查文件名和路径。")
except PermissionError:
print("没有权限读取文件,请检查文件权限。")
except OSError:
print("发生输入/输出错误。")
使用 else
和 finally
块
else
块
else
块中的代码会在没有发生异常时执行。这是用于处理正常情况的代码。
try:
with open("diary.txt", "r") as file:
content = file.read()
except FileNotFoundError:
print("文件不存在,请检查文件名和路径。")
else:
print("文件内容:")
print(content)
finally
块
finally
块中的代码无论是否发生异常,都会被执行。这通常用于做一些清理工作,如关闭文件。
try:
file = open("diary.txt", "r")
content = file.read()
print(content)
except FileNotFoundError:
print("文件不存在,请检查文件名和路径。")
finally:
file.close()
print("文件已关闭。")
代码样例:一个可以“救急”的错误处理小工具
假设你正在开发一个日记小助手,记录你每天的心情,通过文件操作实现数据的存储和读取。为了确保程序在遇到错误时能够优雅地处理,我们可以使用异常处理机制来“救急”。
代码实现
import os
# 定义日记文件的路径
diary_file = "my_diary.txt"
# 检查文件是否存在
if not os.path.exists(diary_file):
try:
with open(diary_file, "w") as file:
file.write("这是我的日记本。\n")
except IOError as e:
print(f"创建文件时发生错误: {e}")
# 读取日记内容
try:
with open(diary_file, "r") as file:
print("当前日记内容:")
content = file.read()
print(content)
except FileNotFoundError:
print("文件不存在,请检查文件名和路径。")
except PermissionError:
print("没有权限读取文件,请检查文件权限。")
except IOError as e:
print(f"读取文件时发生错误: {e}")
# 记录新的日记内容
new_entry = input("请输入你今天的心情: ")
try:
with open(diary_file, "a") as file:
file.write(f"\n今天的心情: {new_entry}\n")
print("新的日记内容已记录。")
except FileNotFoundError:
print("文件不存在,请检查文件名和路径。")
except PermissionError:
print("没有权限写入文件,请检查文件权限。")
except IOError as e:
print(f"记录日记时发生错误: {e}")
# 读取更新后的日记内容
try:
with open(diary_file, "r") as file:
print("更新后的日记内容:")
content = file.read()
print(content)
except FileNotFoundError:
print("文件不存在,请检查文件名和路径。")
except PermissionError:
print("没有权限读取文件,请检查文件权限。")
except IOError as e:
print(f"读取更新后的日记时发生错误: {e}")
代码详解
-
检查文件是否存在:
if not os.path.exists(diary_file): try: with open(diary_file, "w") as file: file.write("这是我的日记本。\n") except IOError as e: print(f"创建文件时发生错误: {e}")
使用
os.path.exists()
函数检查日记文件是否存在。如果不存在,尝试创建一个新的日记文件,并写入初始内容。如果在创建文件时发生输入/输出错误,会捕获并显示错误信息。 -
读取日记内容:
try: with open(diary_file, "r") as file: print("当前日记内容:") content = file.read() print(content) except FileNotFoundError: print("文件不存在,请检查文件名和路径。") except PermissionError: print("没有权限读取文件,请检查文件权限。") except IOError as e: print(f"读取文件时发生错误: {e}")
使用
try-except
语句读取日记文件的内容,并输出。如果读取过程中发生FileNotFoundError
、PermissionError
或IOError
异常,会捕获并显示相应的错误信息。 -
记录新的日记内容:
new_entry = input("请输入你今天的心情: ") try: with open(diary_file, "a") as file: file.write(f"\n今天的心情: {new_entry}\n") print("新的日记内容已记录。") except FileNotFoundError: print("文件不存在,请检查文件名和路径。") except PermissionError: print("没有权限写入文件,请检查文件权限。") except IOError as e: print(f"记录日记时发生错误: {e}")
使用
input()
函数获取用户输入的新日记内容,然后尝试以追加模式打开文件,将新的内容写入文件。如果在写入过程中发生FileNotFoundError
、PermissionError
或IOError
异常,会捕获并显示相应的错误信息。 -
读取更新后的日记内容:
try: with open(diary_file, "r") as file: print("更新后的日记内容:") content = file.read() print(content) except FileNotFoundError: print("文件不存在,请检查文件名和路径。") except PermissionError: print("没有权限读取文件,请检查文件权限。") except IOError as e: print(f"读取更新后的日记时发生错误: {e}")
再次读取日记文件的内容,输出更新后的日记。如果读取过程中发生
FileNotFoundError
、PermissionError
或IOError
异常,会捕获并显示相应的错误信息。
运行结果
假设你运行了上面的代码,程序会先检查日记文件是否存在,如果不存在则创建一个新的日记文件。然后,程序会读取当前的日记内容并显示。接着,你输入当天的心情,程序将其记录到日记文件中。最后,程序会读取更新后的日记内容并显示。
例如:
当前日记内容:
这是我的日记本。
请输入你今天的心情: 今天天气真好,感觉非常开心。
新的日记内容已记录。
更新后的日记内容:
这是我的日记本。
今天的心情: 今天天气真好,感觉非常开心。
如果在某个步骤中发生错误,程序会友好地提示你,并继续运行后续的步骤。
摘要
编程时遇到错误是常有的事,但不要害怕!本文介绍了 Python 中异常处理的概念,教会你如何优雅地处理程序中可能出现的各种“小惊喜”。通过学习 try
-except
语句和常见的异常类型,你可以确保程序在遇到问题时依然能够正常运行,而不是戛然而止。
- 什么是异常:异常是指程序在运行过程中出现的错误或意外情况。
try
-except
语句:用于捕获和处理异常,确保程序在遇到错误时能够优雅地处理。- 常见异常类型:包括
FileNotFoundError
、PermissionError
、TypeError
、IndexError
、ValueError
、IOError
等。 - 处理多种异常:可以在一个
except
块中处理多种异常类型,也可以为每种异常类型单独编写一个except
块。 - 使用
else
和finally
块:else
块用于在没有发生异常时执行,finally
块无论是否发生异常都会执行,通常用于清理工作。
希望这篇教程能为你与 Python 的旅途带来更多的乐趣和信心。异常处理是编程中不可或缺的一部分,掌握异常处理的基本技巧,将使你在处理实际问题时更加得心应手。继续前行,探索更多 Python 的功能和编程技巧,让我们一起用 Python 编写出更多有用和有趣的应用。-America-拥抱未知,继续前进!🌟💖🚀
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)