异常处理

Python SELF ZH
第 17 级 , 课程 2
可用

3.1 捕获异常

如果我们只是观察异常,就不会谈这么多关于异常的东西。异常是一些特殊的对象,Python程序可以处理它们。异常处理是编程中的一个重要方面,可以提高程序的可靠性和稳定性。

在Python中,tryexceptelsefinally构造用于捕获和处理异常。这些构造允许在程序执行时捕获错误并采取相应的措施。

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 elsefinally语句

除了tryexcept语句,还有两个可选的:elsefinally。现在我来详细讲讲它们。

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),并在合适的地方添加对标准错误的检查。其他的现代框架会帮你搞定。

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION