zoukankan      html  css  js  c++  java
  • Go语言错误处理

    go语言中使用error接口处理异常,两个内置函数panic()和recover()以报告和处理运行时错误和程序中的错

    误场景,一个defer关键字来处理顺序执行。

    一、error异常处理

    01、error接口

    go语言使用接口error处理异常。

    type error interface { 
     Error() string
    }
    

    该接口处于errors包下,只有以下内容:

    package errors
    func New(text string) error { return &errorString{text} }
    type errorString struct { text string }
    func (e *errorString) Error() string { return e.text }
    

    02、New()函数

    可以直接使用New函数定义一个错误数据:

    func main() {
    	i,err:=walk(5)
    	if err==nil{
    		fmt.Println(i)
    	}
    
    	l,err:=walk(10)
    	if err==nil{
    		fmt.Println(l)
    	}
    	fmt.Println(err)
    }
    
    func walk(i int)(s string,err error){
    	if i<10{
    		return "ok",nil
    	}
    	return "no",errors.New("this is false")
    }
    
    
    //ok
    //this is false
    

    03、fmt.Errorf()函数

    调用 errors.New 函数是非常稀少的,因为有一个方便的封装函数 fmt.Errorf,它还会处理字符串格式化。

    package fmt
    import "errors"
    func Errorf(format string, args ...interface{}) error {
        return errors.New(Sprintf(format, args...))
    }
    

    如下:

    func main() {
    	errs:=run("hello")
    	if errs!=nil{
    		fmt.Println(errs)
    	}
    }
    
    func run(s string)error{
    	if len(s)<8{
    		return fmt.Errorf("错误,%v数据长度过短",s)
    	}
    	fmt.Println("ok")
    	return  nil
    }
    
    //错误,hello数据长度过短
    

    二、defer关键字

    defer 关键字将语句延迟执行,在defer所在的函数即将返回或者说结束时,将defer语句执行。

    如果有多个被defer修饰的语句,那么以栈(后进先出)的方式执行,即逆序执行。

    func main()  {
    	//defer关键字用于延迟执行
    	fmt.Println("Start do ..")
    	defer hello(1)
    	defer hello(2)
    	defer hello(3)
    	fmt.Println("End do..")
    
    }
    
    func hello(i int){
    	fmt.Println("Hello",i)
    
    	defer ok(7)//在函数结束前执行
    	fmt.Printf("hello%d函数结束啦
    ",i)
    	return
    }
    
    func ok(i int)  {
    	fmt.Println("yes",i)
    }
    
    

    主函数执行完毕即将结束时,hello()函数从hello(3)开始执行,在hello(3)即将结束时执行ok(7),然后hello(2),hello(1)按照顺序逆序执行。

    Start do ..
    End do..
    Hello 3
    hello3函数结束啦
    yes 7
    Hello 2
    hello2函数结束啦
    yes 7
    Hello 1
    hello1函数结束啦
    yes 7
    
    

    三、panic()、recover()函数

    Go语言引入了两个内置函数panic()和recover()以报告和处理运行时错误和程序中的错 误场景:

    func panic(interface{})

    func recover() interface{}

    01、panic()

    当在一个函数执行过程中调用panic()函数时,正常的函数执行流程将立即终止,但函数中 之前使用defer关键字延迟执行的语句将正常展开执行,错误信息将被报 告,包括在调用panic()函数时传入的参数,这个过程称为错误处理流程。

    func main() {
    
    	defer fmt.Println("宕机也要执行的语句")
    	defer fmt.Println("宕机之前的defer语句仍然执行")
    
    
    	panic("错误,宕机")
    	defer fmt.Println("宕机之前的语句不再执行")
    	fmt.Println("no........")
    }
    
    
    宕机之前的defer语句仍然执行
    宕机也要执行的语句
    panic: 错误,宕机
    
    goroutine 1 [running]:
    main.main()
    	E:/GoProject/aone/src/panicdemo.go:10 +0x147
    
    Process finished with exit code 2
    

    02、recover()

    recover()函数用于终止错误处理流程。一般情况下,recover()应该在一个使用defer

    关键字的函数中执行以有效截取错误处理流程。

    func main() {
    
    	defer func() {
    		err:=recover()
    		fmt.Println("捕获数据:",err)
    	}()
    	defer fmt.Println("宕机也要执行的语句")
    	defer fmt.Println("宕机之前的defer语句仍然执行")
    
    
    	panic("错误,宕机")
    	fmt.Println("no........")
    
    }
    
    
    宕机之前的defer语句仍然执行
    宕机也要执行的语句
    捕获数据: 错误,宕机
    
    
  • 相关阅读:
    cefsharp设置默认语言
    C#创建委托实例
    C++/C#互调步骤
    mybatis别名
    redis
    数据库优化方面的事情:
    Properties类使用详解
    七层协议以及如何很好得记忆
    Http 请求到后端过程
    【转】那些年用过的Redis集群架构(含面试解析)
  • 原文地址:https://www.cnblogs.com/cgl-dong/p/14034882.html
Copyright © 2011-2022 走看看