MST

星途 面试题库

面试题:Go语言错误链与接口设计及跨包复用

设计一个通用的错误处理和错误链构建模块,使其能在多个不同功能的包中复用。要求这个模块通过接口来实现错误的标准化处理和错误链的构建,并且在不同包使用时,能够根据具体业务添加特定的错误信息到错误链中。请详细阐述接口设计、错误链构建逻辑以及如何在不同包中导入和使用该模块,并给出完整的代码示例。
17.1万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

接口设计

定义一个通用的错误处理接口,用于标准化错误处理和错误链构建。

// ErrorHandler 定义错误处理接口
type ErrorHandler interface {
    // HandleError 处理错误,并返回包含特定业务信息的错误链
    HandleError(baseErr error, businessMsg string) error
}

错误链构建逻辑

通过实现上述接口来构建错误链。在 HandleError 方法中,将基础错误和业务特定信息组合成新的错误,并返回。

// DefaultErrorHandler 实现 ErrorHandler 接口
type DefaultErrorHandler struct{}

// HandleError 处理错误并构建错误链
func (d *DefaultErrorHandler) HandleError(baseErr error, businessMsg string) error {
    if baseErr == nil {
        return nil
    }
    return fmt.Errorf("%s: %w", businessMsg, baseErr)
}

在不同包中导入和使用该模块

  1. 假设模块名为 errorhandling,在不同包中导入该模块。
  2. 创建 ErrorHandler 接口的实例,并使用其 HandleError 方法处理错误。

完整代码示例

以下是一个完整的示例,展示了如何创建、导入和使用这个错误处理模块。

错误处理模块代码 (errorhandling/errorhandling.go)

package errorhandling

import (
    "fmt"
)

// ErrorHandler 定义错误处理接口
type ErrorHandler interface {
    HandleError(baseErr error, businessMsg string) error
}

// DefaultErrorHandler 实现 ErrorHandler 接口
type DefaultErrorHandler struct{}

// HandleError 处理错误并构建错误链
func (d *DefaultErrorHandler) HandleError(baseErr error, businessMsg string) error {
    if baseErr == nil {
        return nil
    }
    return fmt.Errorf("%s: %w", businessMsg, baseErr)
}

主程序代码 (main.go)

package main

import (
    "fmt"

    "yourpath/errorhandling"
)

func main() {
    var handler errorhandling.ErrorHandler = &errorhandling.DefaultErrorHandler{}
    baseErr := fmt.Errorf("基础错误")
    businessMsg := "业务特定错误信息"
    newErr := handler.HandleError(baseErr, businessMsg)
    fmt.Println(newErr)
}

在上述代码中,errorhandling 包定义了 ErrorHandler 接口和 DefaultErrorHandler 结构体来实现错误处理和错误链构建。在 main 函数中,导入 errorhandling 包,创建 DefaultErrorHandler 实例,并使用 HandleError 方法处理错误并构建错误链。根据实际需求,不同包可以创建自己的 ErrorHandler 实现,以满足特定业务的错误处理需求。