MST
星途 面试题库

面试题:Python上下文管理器自定义及复杂异常处理场景

自定义一个数据库连接的上下文管理器,要求在进入上下文时创建数据库连接,退出时关闭连接。同时,在执行数据库查询操作时,可能会遇到多种异常,如数据库连接异常(假设为CustomDBConnectionError自定义异常类)、SQL语句语法错误(假设为CustomSQLSyntaxError自定义异常类),请合理处理这些异常,确保在不同异常情况下资源能正确释放,并且对不同异常进行不同的日志记录(可以简单打印不同异常信息来模拟日志记录)。
46.4万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
import logging


class CustomDBConnectionError(Exception):
    pass


class CustomSQLSyntaxError(Exception):
    pass


class DatabaseConnection:
    def __init__(self, host, port, user, password, database):
        self.host = host
        self.port = port
        self.user = user
        self.password = password
        self.database = database
        self.connection = None

    def __enter__(self):
        try:
            # 这里模拟创建数据库连接,实际应用中需要替换为真实的连接方法
            self.connection = f"Connected to {self.host}:{self.port} as {self.user} on {self.database}"
            return self
        except Exception as e:
            raise CustomDBConnectionError(f"Database connection error: {e}")

    def execute_query(self, query):
        try:
            # 这里模拟执行查询,实际应用中需要替换为真实的执行查询方法
            print(f"Executing query: {query} on connection {self.connection}")
            return "Query result"
        except Exception as e:
            raise CustomSQLSyntaxError(f"SQL syntax error: {e}")

    def __exit__(self, exc_type, exc_val, exc_tb):
        if self.connection:
            # 这里模拟关闭数据库连接,实际应用中需要替换为真实的关闭方法
            self.connection = None
            print("Database connection closed")
        if exc_type == CustomDBConnectionError:
            logging.error(f"Database connection error occurred: {exc_val}")
        elif exc_type == CustomSQLSyntaxError:
            logging.error(f"SQL syntax error occurred: {exc_val}")
        return True


你可以这样使用:

with DatabaseConnection('localhost', 5432, 'user', 'password', 'test_db') as db:
    try:
        result = db.execute_query("SELECT * FROM users")
        print(result)
    except (CustomDBConnectionError, CustomSQLSyntaxError) as e:
        pass