面试题答案
一键面试异常继承体系设计
- 基类异常:首先定义一个基类异常,作为所有自定义异常的父类。
class MyBaseException(Exception):
pass
- 业务特定异常:根据不同的业务模块或功能,从基类异常继承出具体的异常类。例如,假设项目中有数据处理和网络请求两个主要模块。
class DataProcessingError(MyBaseException):
pass
class NetworkRequestError(MyBaseException):
pass
- 更具体的异常:进一步细化特定业务异常。比如在数据处理模块中,可能有数据格式错误和数据缺失错误。
class DataFormatError(DataProcessingError):
pass
class DataMissingError(DataProcessingError):
pass
在网络请求模块中,可能有连接超时和请求失败的异常。
class ConnectionTimeoutError(NetworkRequestError):
pass
class RequestFailedError(NetworkRequestError):
pass
引发和处理异常示例
- 数据处理模块:
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}")
- 网络请求模块:
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}")
通过这样的异常继承体系设计,在不同的业务逻辑中引发和处理异常,能够使代码的异常处理更加清晰和层次化,增强代码的健壮性。