MST

星途 面试题库

面试题:Python异常处理机制的深度剖析

在Python中,当你在try - except块中捕获异常后,如何确保无论异常是否发生,某些资源(如文件句柄)都能正确关闭?请详细说明使用`finally`子句和`with`语句的原理及场景,并通过代码示例展示。
39.4万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

使用finally子句

  1. 原理finally子句无论try块中是否发生异常,都会被执行。在捕获异常并处理后,或者try块正常执行完毕后,都会执行finally中的代码。这使得它非常适合用于清理资源,如关闭文件句柄、数据库连接等。
  2. 场景:适用于各种需要确保资源关闭的场景,尤其是在早期Python版本中,with语句支持不完善时。
  3. 代码示例
file = None
try:
    file = open('test.txt', 'r')
    data = file.read()
    print(data)
except FileNotFoundError as e:
    print(f"文件未找到: {e}")
finally:
    if file:
        file.close()

使用with语句

  1. 原理with语句会在进入代码块时调用对象的__enter__方法,在离开代码块时(无论是否发生异常)调用对象的__exit__方法。对于文件对象,__exit__方法会自动关闭文件,无需手动调用close方法。
  2. 场景:主要用于文件操作、数据库连接等需要自动管理资源生命周期的场景。它简化了代码,并且确保资源在使用完毕后正确关闭,即使发生异常。
  3. 代码示例
try:
    with open('test.txt', 'r') as file:
        data = file.read()
        print(data)
except FileNotFoundError as e:
    print(f"文件未找到: {e}")

总的来说,with语句语法更简洁,适用于大多数常见的资源管理场景;而finally子句更通用,在一些复杂场景或需要更多自定义清理逻辑时更有用。