MST

星途 面试题库

面试题:Python中try - except块与上下文管理器及异常链的综合应用

编写一个Python函数,该函数使用上下文管理器打开一个数据库连接,并在连接过程中可能会遇到多种异常,如数据库驱动未安装(ImportError)、连接超时(TimeoutError)等。使用try - except块捕获这些异常,并通过异常链将原始异常信息准确传递给调用者,同时在函数内部对异常进行适当的日志记录。要求详细说明异常处理过程以及异常链的作用。
35.1万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
import logging
import contextlib


def connect_to_database():
    try:
        with contextlib.suppress(ImportError):
            # 假设这里是导入数据库驱动的代码
            import some_database_driver
        try:
            # 假设这里是建立数据库连接的代码
            connection = some_database_driver.connect(timeout=5)
            return connection
        except TimeoutError as e:
            logging.error(f"连接超时: {e}")
            raise
    except ImportError as e:
        logging.error(f"数据库驱动未安装: {e}")
        raise

异常处理过程

  1. 导入数据库驱动:使用contextlib.suppress(ImportError)来抑制ImportError异常。如果导入失败,异常会被捕获并记录日志,然后重新抛出异常。
  2. 建立数据库连接:尝试建立数据库连接,如果连接超时,TimeoutError异常会被捕获,记录日志并重新抛出异常。

异常链的作用

异常链允许在捕获并重新抛出异常时,保留原始异常的信息。当调用者捕获重新抛出的异常时,可以通过__cause__属性访问原始异常,这有助于定位问题根源。例如,如果在连接数据库时因为导入驱动失败而引发异常,调用者可以通过异常链追溯到ImportError,了解到是驱动未安装导致的问题。这样在调试和排查问题时,能够提供更全面和准确的信息。