// PathError records an error and the operation and file path that caused it.typePathErrorstruct { Op string// "open", "unlink", etc. Path string// The associated file. Err error// Returned by the system call.}func (e *PathError) String() string {return e.Op +" "+ e.Path +": "+ e.Err.Error()}
// err != nilif e, ok := err.(*os.PathError); ok {// remedy situation}
或:
switch err := err.(type) {caseParseError:PrintParseError(err)casePathError:PrintPathError(err)...default: fmt.Printf("Not a special error, just %s\n", err)}
typeSyntaxErrorstruct { msg string// description of error// error occurred after reading Offset bytes, from which line and columnnr can be obtained Offset int64}func (e *SyntaxError) String() string { return e.msg }
在调用代码中你可以像这样用类型断言测试错误是不是上面的类型:
if serr, ok := err.(*json.SyntaxError); ok { line, col :=findLine(f, serr.Offset)return fmt.Errorf("%s:%d:%d: %v", f.Name(), line, col, err)}
包也可以用额外的方法(methods)定义特定的错误,比如 net.Error:
packagenettypeErrorinterface {Timeout() bool// Is the error a timeout?Temporary() bool// Is the error temporary?}