MST

星途 面试题库

面试题:Python异常处理专家难度题目

在一个大型Python项目中,多个模块之间存在复杂的调用关系。假设其中某个模块的某个函数可能引发多种不同的业务异常,这些异常可能需要在不同的调用层级进行不同的处理(有的异常需要向上抛,有的异常需要在本地处理并记录日志等)。请阐述一种设计良好的异常处理架构,能够灵活应对这种复杂场景,并给出关键代码示例来展示如何实现异常的正确捕获、处理和传递。
12.8万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

异常处理架构设计思路

  1. 自定义异常类:根据不同的业务异常类型,定义相应的自定义异常类,这样可以更清晰地区分不同类型的异常,并在捕获时进行针对性处理。
  2. 异常处理策略分层:在不同的调用层级,根据业务需求,决定是捕获并处理异常,还是将异常向上抛出。例如,底层模块可以将异常抛出,由上层模块决定如何处理;而上层模块可能有专门的异常处理层,根据不同的异常类型进行日志记录、返回特定的错误信息等操作。
  3. 日志记录:对于捕获并处理的异常,记录详细的日志信息,以便于排查问题。

关键代码示例

import logging

# 配置日志记录
logging.basicConfig(level=logging.INFO)


# 自定义业务异常类
class BusinessError1(Exception):
    pass


class BusinessError2(Exception):
    pass


# 模拟底层模块函数,可能引发异常
def low_level_function():
    import random
    num = random.randint(1, 2)
    if num == 1:
        raise BusinessError1("BusinessError1 occurred")
    else:
        raise BusinessError2("BusinessError2 occurred")


# 中层模块函数,捕获部分异常并处理,部分向上抛
def middle_level_function():
    try:
        low_level_function()
    except BusinessError1:
        logging.info("Caught BusinessError1 and handle it locally.")
        # 本地处理逻辑,例如记录日志、返回特定值等
        return "Handled BusinessError1"
    # BusinessError2 不处理,向上抛


# 高层模块函数,捕获剩余异常并处理
def high_level_function():
    try:
        middle_level_function()
    except BusinessError2:
        logging.info("Caught BusinessError2 at high level.")
        # 高层处理逻辑,例如返回给用户友好的错误信息
        return "Error occurred: BusinessError2"


if __name__ == "__main__":
    result = high_level_function()
    print(result)

在上述代码中:

  • 定义了 BusinessError1BusinessError2 两个自定义异常类,模拟不同的业务异常。
  • low_level_function 模拟底层模块函数,随机引发不同的异常。
  • middle_level_function 捕获 BusinessError1 并进行本地处理,而 BusinessError2 则向上抛出。
  • high_level_function 捕获 middle_level_function 抛出的 BusinessError2 并处理。通过这种分层的异常处理架构,可以灵活应对复杂的异常处理场景。