package main // //import ( // "errors" // "fmt" // "os" //) // //// 自定义全局错误 //type BizError struct { // Code int // Msg string // Module string // Err error // 添加底层错误 //} // //func (e *BizError) Error() string { // return fmt.Sprintf("[%s] %d: %s", e.Module, e.Code, e.Msg) //} // //// Unwrap 返回底层错误,支持 errors.Is 和 errors.As 递归解包 //func (e *BizError) Unwrap() error { // return e.Err //} // //// 哨兵错误 //var ErrFileNotFound = errors.New("file not found") // //// 底层方法:包装系统错误 //func open(name string) error { // _, err := os.Open(name) // if err != nil { // return fmt.Errorf("open exec: %w", ErrFileNotFound) // } // return nil //} // //// 业务方法:包装底层错误 + 自定义错误 //func handleFile(name string) error { // if err := open(name); err != nil { // // 触发自定义业务错误 // return &BizError{ // Code: 50001, // Msg: "文件处理异常", // Module: "file", // Err: err, // 包装底层错误 // } // } // return nil //} // //// 统一错误解析 //func resolveError(err error) { // if err == nil { // return // } // fmt.Printf("完整错误:%v\n", err) // // // 1. 断言自定义错误 // var biz *BizError // if errors.As(err, &biz) { // fmt.Printf("自定义错误:%v\n", biz) // // 2. 如果有底层错误,递归检查哨兵错误 // if biz.Unwrap() != nil { // fmt.Printf("底层错误:%v\n", biz.Unwrap()) // // // 3. 检查哨兵错误 // if errors.Is(biz.Unwrap(), ErrFileNotFound) { // fmt.Println("✓ 哨兵错误:文件不存在") // } // } // } else { // // 4. 直接检查哨兵错误(兼容简单错误链) // if errors.Is(err, ErrFileNotFound) { // fmt.Println("✓ 哨兵错误:文件不存在") // } // } // // // 5. 服务降级 // fmt.Println("执行降级:返回默认文件内容") //} // //func main() { // fmt.Println("===== Go 错误处理综合实战 =====") // err := handleFile("demo.txt") // resolveError(err) // fmt.Println("\n===== 测试正常情况 =====") // // 创建一个存在的文件进行测试 // tmpFile := "temp_test.txt" // os.WriteFile(tmpFile, []byte("test"), 0644) // err2 := handleFile(tmpFile) // if err2 == nil { // fmt.Println("文件处理成功") // } // os.Remove(tmpFile) //}