面试题答案
一键面试设计思路
- 抽象错误基类:定义一个基类,所有自定义错误继承自该基类,便于统一处理和管理。
- 错误分类:根据不同的功能模块或错误类型进行分类,例如网络错误、数据库错误、业务逻辑错误等。
- 扩展性:允许开发者方便地添加新的错误类型,只需继承基类并定义相应的错误信息和处理逻辑。
- 灵活性:支持不同层次的错误处理,从全局到局部,如在视图函数、中间件、应用程序级别等。
- 融合性:提供与Flask、Django等主流框架集成的接口,例如通过装饰器、中间件等方式。
实现步骤
- 定义错误基类
class MyBaseError(Exception):
def __init__(self, message):
self.message = message
def __str__(self):
return self.message
- 定义具体错误类
class NetworkError(MyBaseError):
pass
class DatabaseError(MyBaseError):
pass
class BusinessLogicError(MyBaseError):
pass
- 在代码中抛出错误
def some_function():
try:
# 一些可能引发错误的代码
raise NetworkError("网络连接失败")
except NetworkError as e:
print(f"捕获到网络错误: {e}")
- 与主流框架融合
- Flask:可以通过自定义装饰器来处理错误。
from flask import Flask, jsonify
app = Flask(__name__)
def handle_my_errors(func):
def wrapper(*args, **kwargs):
try:
return func(*args, **kwargs)
except MyBaseError as e:
return jsonify({"error": str(e)}), 400
return wrapper
@app.route('/')
@handle_my_errors
def index():
raise BusinessLogicError("业务逻辑有误")
return "Hello World"
- **Django**:可以通过中间件来处理错误。
class MyErrorMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
try:
response = self.get_response(request)
except MyBaseError as e:
from django.http import JsonResponse
return JsonResponse({"error": str(e)}, status = 400)
return response
然后在 settings.py
中注册中间件。
关键技术点
- 继承与多态:利用Python的类继承机制,实现错误的层次结构和多态处理。
- 异常处理机制:Python的
try - except
语句,用于捕获和处理自定义错误。 - 装饰器与中间件:在Flask中使用装饰器,在Django中使用中间件,实现与主流框架的融合,便于统一处理错误。
- 错误信息传递:通过构造函数传递和获取错误信息,确保错误信息的准确性和可读性。