Files
bulma/error_wrap.go
T

77 lines
2.0 KiB
Go

package main
//
//import (
// "errors"
// "fmt"
// "os"
//)
//
//// 自定义错误类型:文件不存在错误
//type FileNotExistError struct {
// Filename string
//}
//
//func (e *FileNotExistError) Error() string {
// return fmt.Sprintf("file [%s] does not exist", e.Filename)
//}
//
//// 多层函数调用:模拟文件操作 + 错误包装
//func readFile(name string) error {
// if err := openFile(name); err != nil {
// // 上层包装:添加上下文
// return fmt.Errorf("readFile failed: %w", err)
// }
// return nil
//}
//
//func openFile(name string) error {
// // 底层错误:系统原生错误
// _, err := os.Open(name)
// if err != nil {
// // 底层包装:绑定文件名上下文
// return fmt.Errorf("open file [%s] failed: %w", name, err)
// }
// return nil
//}
//
//func main() {
// fmt.Println("===== 错误包装与链追踪 =====")
// err := readFile("not_exist.txt")
//
// // 输出完整错误链
// fmt.Println("完整错误:", err)
// // 单次解包
// fmt.Println("解包一层:", errors.Unwrap(err))
// // 递归检测系统错误
// if errors.Is(err, os.ErrNotExist) {
// fmt.Println("判定结果:文件不存在")
// }
//
// fmt.Println("\n===== 使用 errors.As 提取特定错误类型 =====")
//
// // 演示 errors.As:提取路径错误类型
// var pathErr *os.PathError
// if errors.As(err, &pathErr) {
// fmt.Printf("提取到 PathError: 操作=%s, 路径=%s\n", pathErr.Op, pathErr.Path)
// }
//
// // 演示 errors.As:提取系统错误
// var sysErr error
// if errors.As(err, &sysErr) {
// if errors.Is(sysErr, os.ErrNotExist) {
// fmt.Println("通过 errors.As+Is 确认:底层是 ErrNotExist")
// }
// }
//
// // 自定义错误类型示例
// fmt.Println("\n===== 自定义错误类型示例 =====")
// customErr := &FileNotExistError{Filename: "test.txt"}
// wrappedCustom := fmt.Errorf("config load failed: %w", customErr)
//
// var fileErr *FileNotExistError
// if errors.As(wrappedCustom, &fileErr) {
// fmt.Printf("提取到自定义错误类型:文件名=%s\n", fileErr.Filename)
// }
//}