七.错误处理

目录

1、错误处理

1、error一般是处理一些比较低级的错误,不会造成程序中断或者宕机。

2、panic一般是发生了致命的错误时才会被调用,例如数组越界,空指针等等,

2.1 手动调用panic

2.2 数组越界造成panic

2、recover函数


1、错误处理

异常处理(error-错误、panic-恐慌、recover-恢复)

1、error一般是处理一些比较低级的错误,不会造成程序中断或者宕机。

简单使用标准库的两个错误函数:

package main 
import ( 
"errors" 
"fmt" 
) 
func main(){ 
err1 := fmt.Errorf("%s", "this is a Errorf") 
fmt.Println("err1: ", err1) 
err2 := errors.New("this New error") 
fmt.Println("err2: ", err2) 
} 

error常用的用法

package main

import (

"errors"

"fmt"

)

// error 为nil说明正常,否则报错,信息从errors.New获取

func MyDiv(a, b int) (result int, err error){

err = nil

if b == 0 {

err = errors.New("分母不能为0")

}else{

result = a/b

}

return // 等价于 return result, err

}

func main(){

ret, err := MyDiv(2, 2)

if err == nil{

fmt.Println("ret = ", ret)

}else{

fmt.Println("表达式存在非法值, err: ", err)

}

ret, err = MyDiv(2, 0)

if err == nil{

fmt.Println("ret = ", ret)

}else{

fmt.Println("表达式存在非法值, err: ", err)

}

}

// 最终可以通过这个函数获取一个errorString结构,从而可以调用Error方法。

func New(text string) error{

return &errorString(text)

}

============================================================

2、panic一般是发生了致命的错误时才会被调用,例如数组越界,空指针等等,

当然我们也可以手动调用panic()函数去触发。类似C语言的assert()断言函

数。

2.1 手动调用panic

package main

import "fmt"

func testa(){

fmt.Println("aaaaaaaaaaaaaa")

}

func testb(){

fmt.Println("bbbbbbbbbbbbbb")

// 手动调用panic()会触发断言

panic("manual triggered assertions, the program breaks")

}

func testc(){

fmt.Println("ccccccccccccccc")

}

func main(){

testa()

testb()

testc()

}

结果如下:

2.2 数组越界造成panic

package main

import "fmt"

func testa(){

fmt.Println("aaaaaaaaaaaaaa")

}

func testb(index int){

// 数组越界造成panic断言

var x [10]int

fmt.Println("x: ", x[index])

}

func testc(){

fmt.Println("ccccccccccccccc")

}

func main(){

testa()

testb(10) // 数组越界触发断言

testc()

}

结果如下:

如果是空指针

2、recover函数

当发生panic错误时,会中断程序,但是有时候我们又不想程序中断,

我们可以使用recover函数去捕获这个中断。但是需要注意:

recover()只有在defer调用的函数有效。

当该函数中定义了defer,并且该函数发生了panic错误,那么该错误会被捕

获,程序会恢复正常。

package main 
import "fmt" 
func testa(){ 
	fmt.Println("aaaaaaaaaaaaaa") 
} 
func testb(index int){ 
// 设置recover 
defer func () { 
	if err := recover() ; err != nil { 
	//fmt.Println("errInfo: ", recover())// 不要再次调用recover()作 
	为信息,因为此时调用是正常的, 
	//因为没有错误了,错误已经在if中被捕获掉 
	fmt.Println("errInfo: ", err) 
	} 
}() 
	// 数组越界造成panic断言 
	var x [10]int 
	fmt.Println("x: ", x[index]) 
} 
func testc(){ 
	fmt.Println("ccccccccccccccc") 
} 
func main(){ 
	testa() 
	testb(10) // 数组越界触发断言 
	testc() 
} 

结果如下:

猜你喜欢

转载自blog.csdn.net/m2282475145/article/details/131199786