Skip to content

异常处理

异常的捕获与处理

try-except 语句

  • try: 尝试执行可能产生异常的代码。
  • except: 捕获异常,并执行对应的代码。
  • else: 如果没有异常发生,执行 else 代码块。
  • finally: 不论是否发生异常,finally 代码块都会执行,常用于资源释放。
python
try:
    # 可能发生异常的代码
    x = 10 / 0
except ZeroDivisionError:
    # 捕获指定的异常
    print("Cannot divide by zero.")
else:
    # 如果没有异常,执行此块
    print("Division successful.")
finally:
    # 无论是否有异常,都会执行
    print("This block always runs.")

输出:

Cannot divide by zero.
This block always runs.

异常的层次结构

Python 中的异常是基于类的,所有异常类都继承自 BaseException。常用异常类包括:

  • Exception: 大多数常见异常的基类。
  • ZeroDivisionError: 除以零时引发。
  • ValueError: 函数接收到正确类型但不适合的值时引发。
  • TypeError: 传递给函数或操作的对象类型不正确时引发。

异常的层次结构可以帮助你捕获特定的异常,也可以捕获所有异常。

python
try:
    x = int("abc")  # 触发 ValueError
except ValueError as ve:
    print(f"Caught a ValueError: {ve}")
except Exception as e:
    print(f"Some other exception occurred: {e}")

自定义异常

如果需要更精确地控制异常,可以自定义异常类,继承自 Exception 类。

python
# 自定义异常类
class InvalidAgeError(Exception):
    def __init__(self, age, message="Invalid age provided"):
        self.age = age
        self.message = message
        super().__init__(self.message)

# 使用自定义异常
def check_age(age):
    if age < 0 or age > 120:
        raise InvalidAgeError(age)
    else:
        print("Valid age.")

try:
    check_age(-5)
except InvalidAgeError as e:
    print(f"Error: {e}")

输出:

Error: Invalid age provided

资源管理

资源管理指的是确保在程序使用完资源后,及时正确地释放资源,如文件、网络连接等。

finally 语句

finally 块无论是否出现异常,都会执行,通常用于清理操作,例如关闭文件、释放连接等。

python
try:
    file = open('example.txt', 'r')
    # 进行文件操作
except FileNotFoundError:
    print("File not found.")
finally:
    file.close()  # 无论是否发生异常,都关闭文件

with 语句与上下文管理

with 语句用于简化资源管理,它自动管理资源的获取和释放。常用于文件操作、数据库连接等场景。

  • with 语句的对象必须实现 __enter____exit__ 方法,也称为上下文管理协议。
  • with 块中,如果没有异常发生,__exit__ 方法在块结束时自动调用;如果发生异常,__exit__ 方法仍然会被调用,来执行清理工作。
python
# 使用with语句自动关闭文件
with open('example.txt', 'r') as file:
    data = file.read()
    print(data)
# 不需要手动调用 file.close(),with块结束时文件会自动关闭

自定义上下文管理器:

python
class MyResource:
    def __enter__(self):
        print("Resource acquired.")
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        print("Resource released.")

# 使用上下文管理
with MyResource():
    print("Using resource.")

输出:

Resource acquired.
Using resource.
Resource released.

总结

  • 异常处理 通过 try-except 捕获和处理运行时错误,避免程序崩溃。
  • 层次结构 帮助我们有针对性地捕获异常。
  • 自定义异常 可以创建符合业务逻辑的异常类型,提供更灵活的异常处理机制。
  • 资源管理 中的 finallywith 语句可以确保资源正确释放,with 是资源管理的推荐方式。
编程洪同学服务平台是一个广泛收集编程相关内容和资源,旨在满足编程爱好者和专业开发人员的需求的网站。无论您是初学者还是经验丰富的开发者,都可以在这里找到有用的信息和资料,我们将助您提升编程技能和知识。
专业开发
高端定制
售后无忧
站内资源均为本站制作或收集于互联网等平台,如有侵权,请第一时间联系本站,敬请谅解!本站资源仅限于学习与参考,严禁用于各种非法活动,否则后果自行负责,本站概不承担!