ch7/ch7-11 #179
Replies: 2 comments
-
这里已经彻底变成机翻了。 |
Beta Was this translation helpful? Give feedback.
-
这纯机翻吧,学go的同时还得分点脑力去理解这绕口的翻译。。。。。 在Go的 package os
func IsExist(err error) bool // 是不是「文件已存在」?
func IsNotExist(err error) bool // 是不是「文件不存在」?
func IsPermission(err error) bool // 是不是「没权限」? 不要用土办法判断错误 你可能想直接看错误信息里有没有特定文字,比如: func IsNotExist(err error) bool {
return strings.Contains(err.Error(), "file does not exist")
} 但这种方法不靠谱!因为不同操作系统报错的信息可能不一样,比如在Windows和Linux上同一个错误显示的文字可能不同。虽然测试的时候用字符串匹配可能方便,但正式代码里千万别这么干。 正确的做法:看错误的结构
type PathError struct {
Op string // 操作类型,比如"open"、"delete"
Path string // 文件路径
Err error // 具体的错误原因
}
// 拼成错误信息:例如 "open /tmp/foo: permission denied"
func (e *PathError) Error() string { ... } 关键点:虽然显示的错误信息是一个字符串,但 例如这段代码: _, err := os.Open("/不存在的文件")
fmt.Println(err) // 输出:open /不存在的文件: no such file or directory
fmt.Printf("%#v\n", err)
// 输出:&os.PathError{Op:"open", Path:"/不存在的文件", Err:0x2} 判断错误的具体类型 比如
代码实现: func IsNotExist(err error) bool {
// 如果是PathError,就取出内部的错误原因
if pe, ok := err.(*PathError); ok {
err = pe.Err
}
// 判断是否是系统级错误或自定义错误
return err == syscall.ENOENT || err == ErrNotExist
} 使用时很简单: _, err := os.Open("/不存在的文件")
fmt.Println(os.IsNotExist(err)) // 输出true 重要提醒: |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
ch7/ch7-11
中文版
https://gopl-zh.github.io/ch7/ch7-11.html
Beta Was this translation helpful? Give feedback.
All reactions