go 错误处理

go 错误处理

定义错误示例

package main

import (
	"errors"
	"fmt"
)

var errNotFound error = errors.New("Not found error")

func main() {
	fmt.Printf("error: %v", errNotFound)
}

 

自定义错误示例

package main

import (
	"fmt"
	"os"
	"time"
)

type PathError struct {
	path       string
	op         string
	createTime string
	message    string
}

func (p *PathError) Error() string {
	return fmt.Sprintf("path=%s op=%s createTime=%s message=%s", p.path,
		p.op, p.createTime, p.message)
}

func Open(filename string) error {

	file, err := os.Open(filename)
	if err != nil {
		return &PathError{
			path:       filename,
			op:         "read",
			message:    err.Error(),
			createTime: fmt.Sprintf("%v", time.Now()),
		}
	}

	defer file.Close()
	return nil
}

func main() {
	err := Open("C:/asdf.txt")
	switch v := err.(type) {
	case *PathError:
		fmt.Println("get path error,", v)
	default:
	}
}

 

panic和recover

package main

import (
	"log"
	"github.com/StackExchange/wmi"
	"fmt"
)

type WinBattery struct {
	Status                   string
	Name                     string
	DeviceID                 string
	EstimatedRunTime         uint32
	EstimatedChargeRemaining uint16
	test string
}

func Win32Battery(s *[]WinBattery) {
	err := wmi.Query("SELECT * FROM Win32_Battery WHERE (Status IS NOT NULL)", s)
	if err != nil {
		panic(err)
	}
}

func f() {
	b()
}

func b() {
	win32 := &[]WinBattery{}
	Win32Battery(win32)
	fmt.Println(win32)
}


func main() {
	defer func() {
		if r := recover(); r != nil {
			log.Printf("Runtime error caught: %v", r)
		}
	}()

	f()
}

Golang 有2个内置的函数 panic() 和 recover(),用以报告和捕获运行时发生的程序错误,与 error 不同,panic-recover 一般用在函数内部。

golang 的错误处理流程:当一个函数在执行过程中出现了异常或遇到 panic(),正常语句就会立即终止,然后执行 defer 语句,再报告异常信息,最后退出 goroutine。如果在 defer 中使用了 recover() 函数,则会捕获错误信息,使该错误信息终止报告。

 

参考博文:https://www.flysnow.org/2019/01/01/golang-error-handle-suggestion.html

 

posted @ 2017-09-07 15:18  shhnwangjian  阅读(247)  评论(0编辑  收藏  举报