MST

星途 面试题库

面试题:Go错误处理的优化策略

假设你正在开发一个复杂的微服务系统,其中涉及多个函数调用和外部API请求。在这个场景下,如何优化错误处理以提高代码的可读性和可维护性?请描述具体的策略,比如使用自定义错误类型、错误包装等,并结合代码示例说明。
38.9万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

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)

这些策略通过将错误分类、添加上下文信息以及集中处理,提高了代码的可读性和可维护性,在复杂的微服务系统中能够更好地管理错误。