Golang Go语言中 A 函数调用 B 函数,有没有可能在 B 不主动返回 error 的情况下,知道 B 执行过程中是否遇到了 error?
Golang Go语言中 A 函数调用 B 函数,有没有可能在 B 不主动返回 error 的情况下,知道 B 执行过程中是否遇到了 error?
比如 B 的定义是 func b() {} 不返回 error 。
panic 和 recovery 满足吗?
更多关于Golang Go语言中 A 函数调用 B 函数,有没有可能在 B 不主动返回 error 的情况下,知道 B 执行过程中是否遇到了 error?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
#1 老哥怎么说 刚开始用 Go 还不太懂 panic 和 error 的关系😂
比如用 chan?
如果在 B 里发生 error 并且 panic, 那么在 A 里就可以通过 recover 来捕获 panic
go panic
c++ throw
panic 能够改变程序的控制流,调用 panic 后会立刻停止执行当前函数的剩余代码,并在当前 Goroutine 中递归执行调用方的 defer ;
recover 可以中止 panic 造成的程序崩溃,它是一个只能在 defer 中发挥作用的函数,在其他作用域中调用不会发挥作用;
所以,如果按照楼主的意思,可以了解一下 Defer+Panic+Recover 这一套组合,看能不能满足需求。
这要看是单纯 func 还是 method 了,func 的话只能 panic 了(但是不推荐 换我的话可能会再 wrap 一次返回 error
虽然 panic 是可以做到,但是这不是应该通用化的做法。
最好还是有错就返回 error,如果有可能的话,请改这个函数接口
是不想写 if err != nil
了吗…可以看看这片博客: https://blog.golang.org/errors-are-values
#6 那其实就是 try-catch-finally… 结果整半天 还是回到 try catch finally 这个流程上面来了
难道不先定义下什么是 error 吗?
大哥不要老想用另一种语言的方式来写一种语言好吧。。。
你咋不说能不能不定义变量类型,变量可以直接用+或者.拼接。
不主动返回 error 是指?
B 遇到错误继续执行?
可能高级编程语言的设计大体上都是相通的吧。
errno??
在 Go 语言中,如果 B 函数没有主动返回 error 类型的值,通常意味着它没有设计成一个会报告错误的函数。然而,有几种方式可以在不直接通过返回值的情况下检测 B 函数执行过程中是否遇到了错误:
-
全局错误状态:可以定义一个全局或包级别的变量来记录错误状态。B 函数在执行过程中,如果检测到错误,可以更新这个全局变量。但这种方法通常不推荐,因为它破坏了函数的封装性和并发安全性。
-
日志记录:B 函数可以使用日志记录库(如 log、zap 等)来记录错误信息。虽然这不直接让 A 函数知道错误,但可以让系统管理员或开发者通过查看日志来诊断问题。
-
上下文(Context):如果 B 函数接受一个 context.Context 参数,它可以在遇到错误时调用 context 的取消函数(如果有的话),或者通过 context 的值存储机制(WithValue)传递错误信息(尽管这通常用于传递请求范围的数据,而非错误)。
-
回调机制:设计一个回调接口,让 B 函数在出错时调用这个回调。这要求 A 函数在调用 B 时提供一个错误处理函数。
-
Panic 和 Recover:B 函数在遇到不可恢复的错误时可以触发 panic。A 函数可以在调用 B 的代码块外使用 defer 和 recover 来捕获这些 panic,从而间接处理错误。但这种方法应谨慎使用,因为它通常用于处理真正的程序错误,而非业务逻辑错误。
总之,虽然可以通过一些技巧间接检测错误,但最直接和推荐的方式仍然是让 B 函数通过返回值报告错误。