MST

星途 面试题库

面试题:Go语言中自定义错误类型与标准错误处理的结合使用

在Go项目中,我们经常需要自定义错误类型来满足业务需求。请说明如何定义一个自定义错误类型,并在函数中返回该自定义错误,同时结合标准的`fmt.Errorf`和`errors.Is`等错误处理函数进行错误判断和处理。给出一个实际场景的代码示例,比如数据库操作失败的自定义错误处理。
31.5万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "errors"
    "fmt"
)

// 定义自定义错误类型
type DatabaseError struct {
    ErrMsg string
}

func (de DatabaseError) Error() string {
    return de.ErrMsg
}

// 模拟数据库操作的函数
func ConnectDatabase() error {
    // 这里模拟数据库连接失败的情况
    success := false
    if!success {
        return DatabaseError{ErrMsg: "数据库连接失败"}
    }
    return nil
}

func main() {
    err := ConnectDatabase()
    if err != nil {
        var dbErr DatabaseError
        if errors.As(err, &dbErr) {
            fmt.Printf("自定义数据库错误: %v\n", dbErr)
        } else {
            fmt.Printf("其他错误: %v\n", err)
        }

        // 使用fmt.Errorf包装错误
        newErr := fmt.Errorf("操作数据库时发生错误: %w", err)
        fmt.Printf("包装后的错误: %v\n", newErr)

        // 使用errors.Is判断错误类型
        if errors.Is(newErr, DatabaseError{}) {
            fmt.Println("这是一个数据库相关的错误")
        }
    }
}
  1. 定义自定义错误类型
    • 首先定义一个结构体DatabaseError,用于表示数据库操作相关的错误。
    • 为该结构体实现error接口的Error方法,返回错误信息字符串。
  2. 在函数中返回自定义错误
    • ConnectDatabase函数模拟数据库连接操作,如果连接失败(这里简单通过success变量模拟),返回DatabaseError类型的错误。
  3. 错误判断和处理
    • main函数中调用ConnectDatabase函数,并获取其返回的错误。
    • 使用errors.As函数判断错误是否为DatabaseError类型,如果是则进行相应处理。
    • 使用fmt.Errorf函数对错误进行包装,添加更详细的上下文信息。
    • 使用errors.Is函数判断包装后的错误是否与DatabaseError类型相关。