go基础-14.异常处理

简介: go基础-14.异常处理

go的异常处理可能是这门语言唯一的一个诟病了吧

由于go语言没有捕获异常的机制,导致每调一个函数都要接一下这个函数的error

网上有个梗,叫做error是go的一等公民

常见的异常处理
向上抛
将错误交给上一级处理

一般是用于框架层,有些错误框架层面不能擅做决定,将错误向上抛不失为一个好的办法

package main

import (
"errors"
"fmt"
)

func Parent() error {
err := method() // 遇到错误向上抛
return err
}
func method() error {
return errors.New("出错了")
}

func main() {
fmt.Println(Parent())
}

中断程序
遇到错误直接停止程序

这种一般是用于初始化,一旦初始化出现错误,程序继续走下去也意义不大了,还不如中断掉

package main

import (
"fmt"
"os"
)

func init() {
// 读取配置文件中,结果路径错了
_, err := os.ReadFile("xxx")
if err != nil {
panic(err.Error())
}
}

func main() {
fmt.Println("啦啦啦")
}

恢复程序
我们可以在一个函数里面,使用一个defer,可以实现对panic的捕获

以至于出现错误不至于让程序直接崩溃

这种一般也是框架层的异常处理所做的

[kod.shejibs.com)
[kod.shubuqing.com)
[kod.shengh.net)
[kod.sf055.com)
[kod.soho-china.com)
[kod.shvicky.com)
[kod.solar-grlm.com)
package main

import (
"fmt"
"runtime/debug"
)

func read() {
defer func() {
if err := recover(); err != nil {
fmt.Println(err) // 捕获异常,打印错误信息
// 打印错误的堆栈信息
s := string(debug.Stack())
fmt.Println(s)
}
}()
var list = []int{2, 3}
fmt.Println(list[2]) // 肯定会有一个panic
}

func main() {

read()
}

当然,这个用于捕获异常的defer的延迟函数可以在调用链路上的任何一个函数上

一般用于在最上层函数,捕获所有异常

参考文档

相关文章
|
5月前
|
Rust 安全 程序员
|
5月前
|
Go 开发者
Golang深入浅出之-Go语言 defer、panic、recover:异常处理机制
Go语言中的`defer`、`panic`和`recover`提供了一套独特的异常处理方式。`defer`用于延迟函数调用,在返回前执行,常用于资源释放。它遵循后进先出原则。`panic`触发运行时错误,中断函数执行,直到遇到`recover`或程序结束。`recover`在`defer`中捕获`panic`,恢复程序执行。注意避免滥用`defer`影响性能,不应对可处理错误随意使用`panic`,且`recover`不能跨goroutine捕获panic。理解并恰当使用这些机制能提高代码健壮性和稳定性。
103 2
|
5月前
|
Go 开发者
Go语言中的异常处理
【2月更文挑战第22天】
42 3
|
5月前
|
Go
Go语言中的异常处理:理解panic与recover
【2月更文挑战第7天】Go语言虽然以简洁和直接错误处理机制而著称,但它也提供了`panic`和`recover`这两个内置函数来处理程序中的异常情况。本文将深入探讨Go语言中的异常处理机制,包括`panic`和`recover`的使用场景、原理以及最佳实践,帮助读者更好地理解如何在Go中处理异常情况。
|
5月前
|
网络协议 BI Go
Go-异常处理(defer recover panic)
Go-异常处理(defer recover panic)
68 0
|
10月前
|
Go
go 异常处理
go 异常处理
36 1
|
Go
Go异常处理机制panic和recover
Go异常处理机制panic和recover
108 0
|
数据采集 Go 开发者
Go-错误、异常处理详解
Go-错误、异常处理详解
170 0
Go-错误、异常处理详解
|
数据库连接 Go
Go基础:延迟调用defer、异常处理
Go基础:延迟调用defer、异常处理
585 1
Go基础:延迟调用defer、异常处理