MST

星途 面试题库

面试题:Go错误处理中`error`接口的深度应用

假设你正在开发一个数据库操作库,需要定义不同类型的错误,如连接错误、查询错误等。请基于`error`接口,详细阐述如何设计一个错误处理体系,包括自定义错误类型的定义、错误的传递和处理逻辑。要求结合具体代码示例说明如何通过类型断言来区分不同类型的错误并进行针对性处理。
41.7万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 自定义错误类型定义
    • 在Go语言中,可以通过定义结构体类型并实现error接口来创建自定义错误类型。
    • 例如,定义连接错误和查询错误:
// 连接错误类型
type ConnectionError struct {
    Reason string
}

func (ce ConnectionError) Error() string {
    return "Connection error: " + ce.Reason
}

// 查询错误类型
type QueryError struct {
    Reason string
}

func (qe QueryError) Error() string {
    return "Query error: " + qe.Reason
}
  1. 错误的传递
    • 在数据库操作函数中,根据不同情况返回相应的自定义错误。
    • 例如,模拟一个数据库连接函数和查询函数:
func ConnectDB() error {
    // 模拟连接失败情况
    if true {
        return ConnectionError{Reason: "Failed to connect to database"}
    }
    return nil
}

func QueryDB() error {
    // 模拟查询失败情况
    if true {
        return QueryError{Reason: "Invalid query syntax"}
    }
    return nil
}
  1. 错误处理逻辑与类型断言
    • 在调用这些函数的地方,通过类型断言来区分不同类型的错误并进行针对性处理。
func main() {
    err := ConnectDB()
    if err != nil {
        if connErr, ok := err.(ConnectionError); ok {
            // 处理连接错误
            println("Handling connection error:", connErr.Reason)
        } else if queryErr, ok := err.(QueryError); ok {
            // 处理查询错误
            println("Handling query error:", queryErr.Reason)
        } else {
            // 处理其他未知错误
            println("Unknown error:", err.Error())
        }
    }

    err = QueryDB()
    if err != nil {
        if connErr, ok := err.(ConnectionError); ok {
            println("Handling connection error:", connErr.Reason)
        } else if queryErr, ok := err.(QueryError); ok {
            println("Handling query error:", queryErr.Reason)
        } else {
            println("Unknown error:", err.Error())
        }
    }
}

通过上述代码,我们首先定义了连接错误和查询错误两种自定义错误类型,在函数中根据不同情况返回相应错误,然后在调用处通过类型断言来区分并处理不同类型的错误,从而构建了一个简单的错误处理体系。