3.1 捕获异常
如果我们只是观察异常,就不会谈这么多关于异常的东西。异常是一些特殊的对象,Python程序可以处理它们。异常处理是编程中的一个重要方面,可以提高程序的可靠性和稳定性。
在Python中,try
、except
、else
和finally
构造用于捕获和处理异常。这些构造允许在程序执行时捕获错误并采取相应的措施。
try-except
构造
try-except
构造用于捕获和处理异常。try
块包含可能引发异常的代码,而except
块包含异常发生时要执行的代码。
示例:
try:
result = 10 / 0
except ZeroDivisionError:
print("错误:除以零。")
如果try
块中的代码引发ZeroDivisionError
异常,那么它将被except
块捕获,并执行调用print()
的代码。
处理多个异常
你可以通过在单独的except
块中指定异常的类型来处理多种异常。
try:
result = int("abc")
except ZeroDivisionError:
print("错误:除以零。")
except ValueError:
print("错误:无效的值。")
捕获所有异常
如果想要捕获所有异常,可以使用没有指定异常类型的except
块。然而不推荐这么做,因为这可能会使调试变得困难,并隐藏重要的错误。
try:
result = 10 / 0
except:
print("发生错误。")
3.2 else
和finally
语句
除了try
和except
语句,还有两个可选的:else
和finally
。现在我来详细讲讲它们。
try-except-else
构造
else
块用于在try
块中没有发生异常时执行代码。
try:
result = 10 / 2
except ZeroDivisionError:
print("错误:除以零。")
else:
print(f"结果:{result}")
try-except-finally
构造
finally
块包含的代码无论是否发生异常都会被执行。这对于释放资源或执行结束操作非常有用。
try:
result = 10 / 0
except ZeroDivisionError:
print("错误:除以零。")
finally:
print("这个块总是会执行。")
完整示例:try-except-else-finally
示例:
try:
result = 10 / 2
except ZeroDivisionError:
print("错误:除以零。")
else:
print(f"结果:{result}")
finally:
print("这个块总是会执行。")
3.3 try-except-else-finally
的例子
让我们来看看一个真实的大例子。比如,我们尝试从磁盘读取文件数据——能有更简单的吗?
file = open("file.txt", "r")
content = file.read()
print(content)
可能会有什么问题?比如,一切都可能出错:
- 文件可能不存在。它可能被误删了,没有保存,或者你的程序运行在一个完全不同的电脑上,从来没有这个文件。
- 文件读取错误。你的程序没有访问该文件的权限,因为它在一个需要管理员权限的目录中。
- 另一程序正在写入该文件,无法读取——它对该文件有独占访问。
这还不够吗?无论在处理文件的哪一步发生错误,你都必须关闭文件,以便操作系统释放分配给该文件的资源。
所以真实的代码大概会是这样:
try:
file = open("non_existent_file.txt", "r")
content = file.read()
except FileNotFoundError:
print("错误:文件未找到。")
except IOError:
print("错误:输入输出错误。")
else:
print(content)
finally:
if 'file' in locals() and not file.closed:
file.close()
print("文件已关闭。")
欢迎来到现实世界,你需要为不仅是“工作场景”,还要为所有可能出错的场景编写代码。
好吧,不用怕——这比看起来要简单。只需要理解什么是边界条件(corner cases
),并在合适的地方添加对标准错误的检查。其他的现代框架会帮你搞定。
GO TO FULL VERSION