设计思路
- 定义基础错误接口:创建一个基础的错误接口,所有具体错误类型都实现这个接口。
- 利用空接口:在函数返回值中使用空接口
interface{}
来返回不同类型的错误。
- 类型断言:在主程序中通过类型断言来判断错误的具体类型,从而进行统一处理。
关键代码示例
package main
import (
"fmt"
)
// 定义基础错误接口
type MyError interface {
Error() string
}
// 定义具体错误类型1
type SpecificError1 struct {
Msg string
}
func (se1 SpecificError1) Error() string {
return se1.Msg
}
// 定义具体错误类型2
type SpecificError2 struct {
Msg string
}
func (se2 SpecificError2) Error() string {
return se2.Msg
}
// 模拟不同模块的函数,返回空接口类型的错误
func module1() (result string, err interface{}) {
// 这里模拟发生错误
return "", SpecificError1{Msg: "Module 1 error"}
}
func module2() (result string, err interface{}) {
// 这里模拟发生错误
return "", SpecificError2{Msg: "Module 2 error"}
}
func main() {
// 调用模块1
_, err := module1()
if err != nil {
if e, ok := err.(SpecificError1); ok {
fmt.Printf("处理SpecificError1: %v\n", e.Error())
} else if e, ok := err.(SpecificError2); ok {
fmt.Printf("处理SpecificError2: %v\n", e.Error())
} else {
fmt.Printf("未知错误: %v\n", err)
}
}
// 调用模块2
_, err = module2()
if err != nil {
if e, ok := err.(SpecificError1); ok {
fmt.Printf("处理SpecificError1: %v\n", e.Error())
} else if e, ok := err.(SpecificError2); ok {
fmt.Printf("处理SpecificError2: %v\n", e.Error())
} else {
fmt.Printf("未知错误: %v\n", err)
}
}
}