Python中异常捕获与处理的方法总结

  • Post category:Python

Python中异常捕获与处理的方法总结

1. 何时需要异常捕获

当程序出现一些非预期行为时,Python会抛出异常,并中断程序的执行。这时,需要我们进行异常捕获,对异常进行处理,以避免程序直接崩溃。

2. 异常捕获的语法

try:
    # 可能会抛出异常的代码块
except Exception1:
    # 异常类型1的处理方式
except Exception2:
    # 异常类型2的处理方式
...
else:
    # 没有异常时的处理方式
finally:
    # 无论是否有异常,都必须执行的代码块
  • try代码块中尝试执行可能会抛出异常的代码。
  • 如果try中的语句执行正常,则会跳过所有的except语句和else语句。
  • 如果try中的语句执行出现异常,则会从上到下依次检查except语句,看哪个异常类型匹配。
  • 如果某个except语句匹配,则执行该语句,并跳出try代码块。
  • 如果没有找到匹配的except语句,则异常会交给外层语句处理,如果没有处理,则会导致程序崩溃。
  • else语句和finally语句块可以根据需要省略,else语句在没有抛出异常时执行,finally语句块无论是否发生异常都一定会执行。

3. 示例1:除数为0异常的处理

例如,现有一个除法的示例程序,需要输入两个数字,计算第一个数字除以第二个数字的结果。

def divide(a, b):
    result = a / b
    print(f"{a}/{b}={result}")

divide(6, 3)
divide(6, 0)
divide(6, 2)

运行后输出:

6/3=2.0
Traceback (most recent call last):
  File "/path/to/file.py", line 7, in <module>
    divide(6, 0)
  File "/path/to/file.py", line 3, in divide
    result = a / b
ZeroDivisionError: division by zero
6/2=3.0

当计算6/0时,会抛出ZeroDivisionError异常,程序会直接崩溃。因此需要使用异常捕获机制进行处理。

def divide(a, b):
    try:
        result = a / b
        print(f"{a}/{b}={result}")
    except ZeroDivisionError:
        print("除数不能为0")

divide(6, 3)
divide(6, 0)
divide(6, 2)

运行后输出:

6/3=2.0
除数不能为0
6/2=3.0

现在,当计算6/0时,会执行except语句块,并输出提示信息,而程序不会崩溃,可以继续执行下去。

4. 示例2:文件操作异常的处理

另外一个常见的场景是文件操作,如果打开文件失败或读取文件时发生异常,需要对异常进行处理。

def read_file(file_path):
    with open(file_path, 'r') as f:
        content = f.read()
        print(content)

read_file('not_exist.txt')
read_file('test.txt')

运行后输出:

Traceback (most recent call last):
  File "/path/to/file.py", line 8, in <module>
    read_file('not_exist.txt')
  File "/path/to/file.py", line 2, in read_file
    with open(file_path, 'r') as f:
FileNotFoundError: [Errno 2] No such file or directory: 'not_exist.txt'
test file

当读取不存在的文件时,会抛出FileNotFoundError异常,导致程序崩溃。因此需要对异常进行捕获和处理。

def read_file(file_path):
    try:
        with open(file_path, 'r') as f:
            content = f.read()
            print(content)
    except FileNotFoundError:
        print("文件不存在")

read_file('not_exist.txt')
read_file('test.txt')

运行后输出:

文件不存在
test file

现在当尝试读取不存在的文件时,会输出except语句块中的信息,程序不会崩溃。