3 回答
TA贡献1831条经验 获得超9个赞
该os软件包提供了os.IsNotExist检查各种文件存在错误的功能:
if err != nil && os.IsNotExist(err) {
fmt.Println("file doesn't exist")
}
TA贡献1783条经验 获得超4个赞
在更一般的级别上,您可以使用strings.Contains()调用err.Error()(返回错误消息的字符串)。例子:
if err == nil || !strings.Contains(err.Error(), "no such file or directory") {
// we didn't get the error we were expecting
}
但是请注意,字符串匹配相当脆弱。如果包作者更改了错误消息,您的测试可能会开始失败,尽管仍然返回正确的错误。
这就是为什么 Go 中的习惯用法通常是让包将它们返回的错误类型定义为包级常量,或者更常见的是变量,因为fmt.Errorf()并errors.New()返回error接口类型,根据定义,接口类型不能是常量,因为接口是引用类型. 作为包级常量,可以直接对其进行测试。例如,sql包定义了sql.ErrNoRows,因此您可以快速轻松地测试查询返回的错误是否表明没有结果行。
TA贡献1780条经验 获得超1个赞
您可以创建一个“常量”并将其用作比较的参考,如下所示:
var ErrFile = errors.New("Error opening image file")
func getFile(path string) (string, error) {
return "", ErrFile
}
func main() {
f := "problem.txt"
_, err := getFile(f)
if err == ErrFile {
fmt.Printf("Problem with file %s", f)
}
}
或者,如果您需要更大的灵活性,您可以创建自己的错误类型。
type FileError struct {
Path string
}
func (e *FileError) Error() string {
return fmt.Sprintf("Error opening image file: %s", e.Path)
}
func getFile(path string) (string, error) {
return "", &FileError{Path: path}
}
func main() {
f := "problem.txt"
_, err := getFile(f)
if ferr, ok := err.(* FileError); ok {
fmt.Println(ferr)
}
}
- 3 回答
- 0 关注
- 135 浏览
添加回答
举报