错误处理

本文探讨了Go语言中的错误处理机制,包括`defer`的调用顺序,`error`接口的使用,以及如何实现统一的错误逻辑。同时讲解了`panic`如何停止函数执行并执行defer,以及`recover`如何在defer中捕获和处理panic。建议在遇到预期错误时使用`error`,而在遇到不可预见的异常情况时使用`panic`。
摘要由CSDN通过智能技术生成

defer的调用

确保调用在函数结束的时候发生
参数在defer语句时计算
defer列表为后进先出

func writeFile(filename string) {
	file, err := os.Create(filename)
	if err != nil {
		panic(err)
	}
	defer file.Close() //确保在函数结束的时候关闭文件
	//直接用file写比较慢,使用bufio,先写到内存里,当内容大到一定的程度之后,再写到文件中
	writer := bufio.NewWriter(file)
	defer writer.Flush() //缓冲-->文件

	f := fib.Fibonacci()
	for i := 0; i < 20; i++ {
		fmt.Fprintln(writer, f())
	}
}

错误处理

error其实就是一个接口

func writeFileError(filename string) {
	file, err := os.OpenFile(filename, os.O_EXCL|os.O_CREATE, 0666) //如果存在文件,打开不了

	//err = errors.New("This is custom error") //自定义error
	if err != nil {
		//将error转为我们已知的错误类型
		if pathError, ok := err.(*os.PathError); !ok { //判断*os.PathError是否实现error接口
			panic(err)
		} else {
			fmt.Println(pathError.Op, " ", pathError.Path, " ", pathError.Err.Error())
		}
		return
	}
	defer file.Close() //确保在函数结束的时候关闭文件
	//直接用file写比较慢,使用bufio,先写到内存里,当内容大到一定的程度之后,再写到文件中
	writer := bufio.NewWriter(file)
	defer writer.Flush() //缓冲-->文件

	f := fib.Fibonacci()
	for i := 0; i < 20; i++ {
		fmt.Fprintln(writer, f())
	}
}

如何实现统一的错误逻辑?

panic和recover

panic

  • 停止当前函数的执行。
  • 一直向上返回,执行每一层的defer。
  • 如果没有遇到recover,程序退出。

recover

  • 仅在defer调用中使用。
  • 获取panic的值。
  • 如果无法处理,可以重新panic。

panic和recover的参数类型都是interface{}。
func panic(v interface{})
func recover() interface{}


func tryRecover() {
	defer func() {
		r := recover()
		if err, ok := r.(error); ok { //r.(error) 将interface{}转为具体的类型
			fmt.Println("Error occured: ", err)
		} else {
			panic(
				fmt.Sprintf("I don't know what to do: %v", r),
			)
		}

	}()
	//panic(errors.New("This is an error"))
	b := 0
	a := 5 / b
	fmt.Println(a)
	//panic(123)
}
func main() {
	tryRecover()
}

有两种错误信息,一种可以给用户看到的错误信息,一种的error错误在代码中将其以log.Warn()的形式出现。输出的错误信息一般都使用小写。
意料之中的使用error,如文件打不开。 意料之外的使用panic,如数组越界。

实例:简单Web服务器,输入相应URL,显示文件内容,可以处理路径错误等错误信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值