面试题答案
一键面试- 自定义错误类型定义:
- 在Go语言中,可以通过定义结构体类型并实现
error
接口来创建自定义错误类型。 - 例如,定义连接错误和查询错误:
- 在Go语言中,可以通过定义结构体类型并实现
// 连接错误类型
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
}
- 错误的传递:
- 在数据库操作函数中,根据不同情况返回相应的自定义错误。
- 例如,模拟一个数据库连接函数和查询函数:
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
}
- 错误处理逻辑与类型断言:
- 在调用这些函数的地方,通过类型断言来区分不同类型的错误并进行针对性处理。
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())
}
}
}
通过上述代码,我们首先定义了连接错误和查询错误两种自定义错误类型,在函数中根据不同情况返回相应错误,然后在调用处通过类型断言来区分并处理不同类型的错误,从而构建了一个简单的错误处理体系。