MST

星途 面试题库

面试题:Python自定义异常与继承体系的深度应用

假设有一个复杂的Python项目,存在多个相关的自定义异常。现在需要构建一个异常继承体系,使得异常处理更加清晰和层次化。请设计这样一个异常继承体系,并举例说明如何在不同的业务逻辑中引发和处理这些自定义异常,以确保代码的健壮性。
37.4万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

异常继承体系设计

  1. 基类异常:首先定义一个基类异常,作为所有自定义异常的父类。
class MyBaseException(Exception):
    pass
  1. 业务特定异常:根据不同的业务模块或功能,从基类异常继承出具体的异常类。例如,假设项目中有数据处理和网络请求两个主要模块。
class DataProcessingError(MyBaseException):
    pass

class NetworkRequestError(MyBaseException):
    pass
  1. 更具体的异常:进一步细化特定业务异常。比如在数据处理模块中,可能有数据格式错误和数据缺失错误。
class DataFormatError(DataProcessingError):
    pass

class DataMissingError(DataProcessingError):
    pass

在网络请求模块中,可能有连接超时和请求失败的异常。

class ConnectionTimeoutError(NetworkRequestError):
    pass

class RequestFailedError(NetworkRequestError):
    pass

引发和处理异常示例

  1. 数据处理模块
def process_data(data):
    if not isinstance(data, dict):
        raise DataFormatError("Data should be in dictionary format")
    if 'key' not in data:
        raise DataMissingError("Key 'key' is missing in data")
    return data['key']

try:
    data = [1, 2, 3]
    result = process_data(data)
except DataFormatError as e:
    print(f"Data format error: {e}")
except DataMissingError as e:
    print(f"Data missing error: {e}")
  1. 网络请求模块
import requests

def make_network_request(url):
    try:
        response = requests.get(url, timeout = 5)
        if response.status_code != 200:
            raise RequestFailedError(f"Request failed with status code {response.status_code}")
        return response.json()
    except requests.exceptions.Timeout:
        raise ConnectionTimeoutError("Connection timed out")

try:
    url = "http://example.com/nonexistent"
    result = make_network_request(url)
except ConnectionTimeoutError as e:
    print(f"Connection timeout: {e}")
except RequestFailedError as e:
    print(f"Request failed: {e}")

通过这样的异常继承体系设计,在不同的业务逻辑中引发和处理异常,能够使代码的异常处理更加清晰和层次化,增强代码的健壮性。