Go通过在函数和方法中返回错误对象作为它们的唯一或最后一个返回值来处理异常。如果返回 nil,则没有错误发生,并且主调(calling)函数总是应该检查收到的错误。
处理错误并且在函数发生错误的地方给用户返回错误信息:照这样处理就算真的出了问题,你的程序也能继续运行并且通知给用户。panic and recover 是用来处理真正的异常(无法预测的错误)而不是普通的错误。
定义错误
任何时候当你需要一个新的错误类型,都可以用 errors(必须先 import)包的 errors.New 函数接收合适的错误信息来创建。
例如
err := errors.New(“math - square root of negative number”)
如果有不同错误条件可能发生,那么对实际的错误使用类型断言或类型判断(type-switch)是很有用的,并且可以根据错误场景做一些补救和恢复操作。
// err != nil
if e, ok := err.(*os.PathError); ok {
// remedy situation
}
包也可以用额外的方法定义特定错误,比如net.Error
package net
type Error interface{
Timrout() bool// Is the error a timeout? Temporary() bool // Is the error temporary?
}
大部分 syscall 函数都返回一个结果和可能的错误,比如:
r, err := syscall.Open(name, mode, perm)
if err != 0 {
fmt.Println(err.Error())
}
os 包也提供了一套像 os.EINAL 这样的标准错误,它们基于 syscall 错误:
var (
EPERM Error = Errno(syscall.EPERM)
ENOENT Error = Errno(syscall.ENOENT)
ESRCH Error = Errno(syscall.ESRCH)
EINTR Error = Errno(syscall.EINTR)
EIO Error = Errno(syscall.EIO)
...
)
用 fmt 创建错误对象
如果想要返回包含错误参数的更有信息量的字符串,可以用 fmt.Errorf() 来实现:它和 fmt.Printf () 完全一样,接收有一个或多个格式占位符的格式化字符串和相应数量的占位变量。和打印信息不同的是它用信息生成错误对象。 例如
if f < 0 { return 0, fmt.Errorf("math: square root of negative number %g", f)
}