异常处理¶

3.4.1 try-except 语句的基本结构¶

在编写Python程序时,我们经常会遇到一些错误或异常情况,可能是由于输入数据错误、程序逻辑错误或外部资源不可用等原因导致的。为了避免程序在遇到这些问题时直接崩溃,Python 提供了异常处理机制,通过 try-except 语句来捕获和处理这些异常。这样,程序不仅能够在异常发生时避免崩溃,还能根据需要做出相应的错误处理。

try-except 语句的基本结构如下:

In [ ]:
try:
    # 可能引发异常的代码
except ExceptionType as e:
    # 发生异常时的处理代码

在这个结构中,try 块包含了我们希望尝试执行的代码。如果在 try 块中的代码出现了异常,Python 会跳过该块的剩余代码,并开始执行 except 块中的代码。ExceptionType 是指捕获的异常类型,它可以是任何 Python 内置的异常类型。如果没有指定具体的异常类型,except 块会捕获所有类型的异常。异常对象 e 可选,它用于存储异常的详细信息。例如,以下代码展示了如何使用 try-except 语句来捕获并处理除零错误(ZeroDivisionError):

In [ ]:
try:
    result = 10 / 0
except ZeroDivisionError as e:
    print(f"发生错误:{e}")

在这个例子中,当执行 10 / 0 时,会抛出 ZeroDivisionError 异常,程序将不会崩溃,而是会跳转到 except 块中执行 print 语句,输出错误信息。

3.4.2 异常的类型¶

Python 内置了多种异常类型,常见的包括:

异常类型 描述
ZeroDivisionError 当尝试除以零时抛出。
ValueError 当传入的参数类型或值不符合预期时抛出。
TypeError 当操作或函数应用于错误类型的对象时抛出。
FileNotFoundError 当尝试打开一个不存在的文件时抛出。
IndexError 当尝试访问一个列表中不存在的索引时抛出。

除了这些常见的异常类型,Python 还允许我们定义自定义异常类型。自定义异常可以通过继承内置的 Exception 类来实现。

3.4.3 捕获多个异常¶

在有些情况下,代码可能会引发多种不同类型的异常。我们可以使用多个 except 块来分别捕获不同类型的异常。例如:

In [ ]:
try:
    num1 = int(input("请输入第一个数字:"))
    num2 = int(input("请输入第二个数字:"))
    result = num1 / num2
except ZeroDivisionError:
    print("错误:不能除以零!")
except ValueError:
    print("错误:请输入有效的数字!")
except Exception as e:
    print(f"发生了其他错误:{e}")

在这个例子中,用户输入两个数字并计算它们的商。如果用户输入非数字值,程序会抛出 ValueError 异常;如果用户输入零作为除数,程序会抛出 ZeroDivisionError 异常。except Exception 块将捕获所有其他未被单独处理的异常,并输出错误信息。

3.4.4 使用 else 和 finally¶

try-except 语句还可以与 else 和 finally 配合使用,以便进行更精确的异常处理。

  • else 块:如果 try 块中的代码没有抛出任何异常,else 块中的代码将被执行。
  • finally 块:无论是否发生异常,finally 块中的代码都会执行,通常用于资源的清理工作,如关闭文件或释放网络连接。

例如:

In [ ]:
try:
    num1 = int(input("请输入第一个数字:"))
    num2 = int(input("请输入第二个数字:"))
    result = num1 / num2
except ZeroDivisionError:
    print("错误:不能除以零!")
except ValueError:
    print("错误:请输入有效的数字!")
else:
    print(f"结果是:{result}")
finally:
    print("程序结束。")

在这个例子中,else 块会在没有发生异常时输出计算结果,而 finally 块无论如何都会执行,输出“程序结束”。

通过 try-except 语句,Python 提供了一种优雅的方式来处理程序中的异常,确保程序在遇到错误时不会直接崩溃,而是可以按照预定的逻辑进行处理。通过捕获特定类型的异常,我们可以更加精准地控制错误处理流程,提高程序的健壮性。同时,结合 else 和 finally,我们可以进一步优化代码的执行和资源管理。