创建error
通常在golang中用下面方式创建error
1. fmt.Errorf
1 2 3
| func action() error { return fmt.Errorf("sth went wrong") }
|
2. errors.New
1 2 3
| func action() error { return errors.New("sth went wrong") }
|
3. 实现error 接口
上面两种创建方式都是使用 errors 进行创建的
errors 实现了 error 接口
1 2 3
| type error interface { Error() string }
|
如果我们需要自定义error 的类型,就需要实现 error 接口
1 2 3 4 5 6 7
| type MyError struct { Msg string }
func (e MyError)Error() string{ return e.Msg }
|
编写约定
golang 约定了error中的string:首母小写,结尾不带标点
1 2
| err := errors.New("sth went wrong") fmt.Printf("The returned error is %s.\n", err)
|
处理异常
是否有异常
是否有特定的异常
通常在程序中会自定义一系列的异常,方便细化处理
全局变量
1 2 3 4 5 6 7
| var ( ErrInvalid = errors.New("invalid argument") ErrPermission = errors.New("permission denied") ErrExist = errors.New("file already exists") ErrNotExist = errors.New("file does not exist") )
|
如果os 包的方法有异常,就可以直接进行比较
1 2
| if err == os.ErrInvalid { }
|
实现error 接口
当需要记录更多异常信息时就要自己实现error 接口
这种情况下可以用类型判断来区分error
下面是个🌰
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| type MyError struct { Msg string }
func (e MyError)Error() string{ return e.Msg }
func SomeFunc() error{ return MyError{"bad things happen"} }
func main() { err := SomeFunc()
switch err.(type){ case MyError: println("MyErr: " + err.Error()) case error: println("error: " + err.Error()) }
if _, ok := err.(MyError); ok { println("TypeAssert: " + err.Error()) } }
|