面试题答案
一键面试1. 使用自定义错误类型
自定义错误类型可以让错误信息更具针对性,提高代码可读性。
class MicroserviceError(Exception):
pass
class APIRequestError(MicroserviceError):
def __init__(self, message, status_code):
self.message = message
self.status_code = status_code
super().__init__(message)
def call_external_api():
# 模拟API请求失败
status_code = 400
message = "API request failed"
raise APIRequestError(message, status_code)
try:
call_external_api()
except APIRequestError as e:
print(f"Caught APIRequestError: {e.message}, Status Code: {e.status_code}")
except MicroserviceError as e:
print(f"Caught MicroserviceError: {e}")
2. 错误包装
错误包装可以在捕获异常后重新抛出一个新的、更具上下文的异常,同时保留原始异常信息。
import requests
class MicroserviceError(Exception):
pass
class APIRequestError(MicroserviceError):
def __init__(self, message, status_code, original_exception):
self.message = message
self.status_code = status_code
self.original_exception = original_exception
super().__init__(message)
def call_external_api():
try:
response = requests.get('https://nonexistent-api.com')
response.raise_for_status()
except requests.RequestException as e:
raise APIRequestError("API request failed", response.status_code, e) from e
try:
call_external_api()
except APIRequestError as e:
print(f"Caught APIRequestError: {e.message}, Status Code: {e.status_code}")
print(f"Original Exception: {e.original_exception}")
3. 集中式错误处理
在微服务系统中,可以设置一个集中的错误处理中间件,统一处理不同层次抛出的错误。
例如,在Python的Flask框架中:
from flask import Flask, jsonify
app = Flask(__name__)
class MicroserviceError(Exception):
pass
class APIRequestError(MicroserviceError):
def __init__(self, message, status_code):
self.message = message
self.status_code = status_code
super().__init__(message)
@app.errorhandler(MicroserviceError)
def handle_microservice_error(error):
response = {
"error": "Microservice Error",
"message": str(error)
}
if isinstance(error, APIRequestError):
response["status_code"] = error.status_code
return jsonify(response), getattr(error, "status_code", 500)
def call_external_api():
raise APIRequestError("API request failed", 400)
@app.route('/')
def index():
try:
call_external_api()
except MicroserviceError as e:
raise e
return "Success"
if __name__ == '__main__':
app.run(debug=True)
这些策略通过将错误分类、添加上下文信息以及集中处理,提高了代码的可读性和可维护性,在复杂的微服务系统中能够更好地管理错误。