Jquery中文网 www.jquerycn.cn
Jquery中文网 >  后端编程  >  Go语言  >  正文 DataWhale & Golang(十、异常处理)

DataWhale & Golang(十、异常处理)

发布时间:2021-05-17   编辑:www.jquerycn.cn
jquery中文网为您提供DataWhale & Golang(十、异常处理)等资源,欢迎您收藏本站,我们将为您提供最新的DataWhale & Golang(十、异常处理)资源

DataWhale & Golang(十、异常处理)


学习大纲: 


目录

DataWhale & Golang(十、异常处理)

学习大纲

10.异常处理

10.1 error

注意

10.2 panic

注意

10.3 源码分析


10.异常处理

10.1 error

Go语言内置了一个简单的错误接口作为一种错误处理机制,接口定义如下:

type error interface {
    Error() string
}

它包含一个 `Error()` 方法,返回值为`string`

Go的error构造有两种方式,分别是

第一种:errors.New()
err := errors.New("This is an error")
if err != nil {
  fmt.Print(err)
}
第二种:fmt.Errorf()
err := fmt.Errorf("This is an error")
if err != nil {
  fmt.Print(err)
}

除了直接使用Go自带的方法,还可以自定义错误。下面以自然数函数作为例子:

type NotNature float64

func (err NotNature) Error() string {
 return fmt.Sprintf("自然数为大于或等于0的数: %v", float64(err))
}

func Nature(x float64) (float64,error) {
  if x<0 {
   return 0,NotNature(x)
  } else {
  return x,nil
  }
}

func main() {
  fmt.Println(Nature(1))
  fmt.Println(Nature(-1))
}

注意:

  • 1.如果函数需要处理异常,通常将error作为多值返回的最后一个值,返回的error值为nil则表示无异常,非nil则是有异常。
  • 2.一般先用if语句处理error!=nil,正常逻辑放if后面。

Go语言的error代表的并不是真“异常”,只是通过返回error来表示错误信息,换句话说,不是运行时错误范围预定义的错误,某种不符合期望的行为并不会导致程序无法运行(自然数函数例子),都应使用error进行异常处理。当程序出现重大错误,如数组越界,才会将其当成真正的异常,并用**panic**来处理。

10.2 panic

Go不使用try...catch方法来处理异常,而是使用panic和recover

先上代码举一个简单的例子
 

func main() {
  fmt.Println("Hello,Go!")
  panic(errors.New(" i am a error"))
  fmt.Println("hello,again!")
}
输出:
Hello,Go!
panic:  i am a error

goroutine 1 [running]:
main.main()
    ~/error.go:12  0xb5
exit status 2

可以看到,panic后面的程序不会被执行了。但是我们捕捉异常并不是为了停止程序(一般情况),而是为了让程序能正常运行下去,这时候就到recover出场了。

package main

import "fmt"

func main(){
  defer func(){
    fmt.Println("我是defer里面第一个打印函数")
    if err:=recover();err!=nil{
        fmt.Println(err)
    }
    fmt.Println("我是defer里面第二个打印函数")
  }()
  f()
}

func f(){
  fmt.Println("1")
  panic("我是panic")
  fmt.Println("2")
}
1
我是defer里面第一个打印函数
我是panic
我是defer里面第二个打印函数

可以看到,f函数一开始正常打印,当遇到panic,就跳到defer函数,执行defer函数里的内容

需要注意的是,defer函数里打印的err其实就是panic里面的内容。

下面详细介绍一下panic和recover的原理。

func panic(v interface{})

//  内置函数panic会停止当前goroutine的正常执行。当函数F调用panic时,F的正常执行立即停止。任何被F延迟执行的函数都将以正常的方式运行,然后F返回其调用者。
//  对调用方G来说,对F的调用就像调用panic一样,终止G的执行并运行任何延迟的函数。直到执行goroutine中的所有函数都按逆序停止。此时,程序将以非0退出代码终止。此终止序列称为panicking,可由内置函数recover控制。
func recover() interface{}
// recover内置函数允许程序管理panicking的goroutine的行为。
// 在defer函数(但不是它调用的任何函数)内执行恢复调用,通过恢复正常执行来停止panicking序列,并检索传递给panic调用的错误值。
// 如果在defer函数之外调用recover,则不会停止panicking的序列。在这种情况下,或者当goroutine不panicking时,或者提供给panic的参数是nil,recover返回nil。因此,recover的返回值报告goroutine是否panicking

注意:

defer和recover必须在panic之前定义,否则无效。

10.3 源码分析

errors.New的定义如下

// src/errors/errors.go
// New returns an error that formats as the given text.
// Each call to New returns a distinct error value even if the text is identical.
func New(text string) error {
    return &errorString{text}
}

// errorString is a trivial implementation of error.
type errorString struct {
    s string
}

func (e *errorString) Error() string {
    return e.s
}
  • 1.New函数返回格式为给定文本的错误
  • 2.即使文本是相同的,每次对New的调用都会返回一个不同的错误值。
到此这篇关于“DataWhale & Golang(十、异常处理)”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
DataWhale & Golang(十、异常处理)
golang基础教程
Golang协程原理(一)
golang url 收集
Go语言学习 第五章 运算符和表达式 ②
「golang系列」浅谈Go语言
golang会取代php吗
《Go语言四十二章经》第九章 运算符
go学习(十二)——Go 语言错误与异常处理机制
golang的协程原理

[关闭]