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