go-errorAndexception

error 相关

package main

import (
"errors"
"fmt"
)

type Customerror struct {
infoa string
infob string
Err error
}

func (cerr Customerror) Error() string {
errorinfo := fmt.Sprintf("infoa : %s , infob : %s , original err info : %s ", cerr.infoa, cerr.infob, cerr.Err.Error())
return errorinfo
}

func main() {
//方法一:
//采用errors包的New方法 返回一个err的类型
var err error = errors.New("this is a new error")
//由于已经实现了error接口的方法 因此可以直接调用对应的方法
fmt.Println(err.Error())

//方法二:
//采用fmt.Errof 将string信息转化为error信息 并返回
err = fmt.Errorf("%s", "the error test for fmt.Errorf")
fmt.Println(err.Error())

//方法三:
//采用自定义的方式实现一个error的 一个duck 类型
err = &Customerror{
infoa: "err info a",
infob: "err info b",
Err: errors.New("test custom err"),
}

fmt.Println(err.Error())

}

/*output:
this is a new error
the error test for fmt.Errorf
infoa : err info a , infob : err info b , original err info : test custom err
*/

// 使用 if 复合语句
if value, err := pack1.Func1(param1); err != nil {
fmt.Printf(“Error %s in pack1.Func1 with parameter %v”, err.Error(), param1)
return // or: return err
}

defer语句

通过defer定义的函数,参数是立即演算的,但只有在所在函数返回的时候才被调用执行。主要用来释放资源。
defer的函数是保存在堆栈里面的,可以指定多个defer函数,按照堆栈顺序处理。

func handleA() {
fmt.Println("handle A")
}
func handleB() {
fmt.Println("handle B")
}

func doStuff1() (int,error){
return 0, nil
}

func doStuff2() (int,error){
return 0, fmt.Errorf("-1")
}

func foo() {
var err error
defer func() {
if err != nil {
handleA()
handleB()
}
}()

_,err = doStuff1()
if err != nil {
return
}

_,err = doStuff2()
if err != nil {
return
}
}
defer func(conn net.Conn) {
fmt.Println("client closed")
conn.Close()
if err := recover(); err != nil {
errMsg := "has panic here."
// find out exactly what the error was and set err
switch x := err.(type) {
case string:
errMsg += x
case error:
errMsg += x.Error()
default:
errMsg = "Unknown panic"
}
logger.Error(errMsg )
fmt.Println(err) // 这里的err其实就是panic传入的内容,55
}
}(conn)