Files
bulma/error_main.go
T

98 lines
2.3 KiB
Go

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)
//}