3 回答
TA贡献1789条经验 获得超8个赞
可以定义一个函数来忽略错误,但是 Go 缺乏泛型,所以你必须到处使用 interface{} 和类型转换,在这个过程中失去了类型检查器的大量静态保证。它非常丑陋。不要这样做。
func ignoreError(val interface {}, err error) interface {} {
return val
}
在每次调用时ignoreError()都必须将类型转换为预期的返回类型。
TA贡献1804条经验 获得超8个赞
您经常会看到的一种可能的抽象模式是使用通用错误处理程序。
这不会阻止您处理错误值,但它确实将错误处理从代码的其余部分抽象出来。
请注意,像这样的抽象被认为是“非惯用的”Go,“纯”的方式是就地显式处理错误。不过,这种由恐慌驱动的替代方案仍然非常有用,尤其是对于您只想将所有错误转储到控制台或日志文件中的脚本进行快速原型设计。
对于可重用的包,我会坚持使用冗长的显式方式,因为其他人会期望产生错误的函数实际返回错误值,而不是使用恐慌恢复机制。
package main
import (
utils
)
func main() {
defer func() {
utils.Handle(func(err error) {
// Handle errors in a generic way,
// for example using println, or writing to http
})
}()
var result, err := someFragileFunction()
Check(err)
}
package utils
func Check(err error) {
if err != nil {
panic(err)
}
}
func Handle(handler func(err error)) {
if r := recover(); r != nil {
if err, ok := r.(error); ok {
handler(err)
} else {
panic(r)
}
}
}
TA贡献1893条经验 获得超10个赞
在真正的答案是:不。
永远不要忽视错误。
严重地。错误是有原因的。如果函数返回错误,则几乎总是意味着在程序运行期间,即使它 100%无错误, 该函数也有可能失败。如果是这样,您通常不想就好像什么也没发生一样继续前进。
如果您绝对确定您正在以一种确保它永远不会返回非零错误的方式使用函数(除非您的程序中存在错误,并且总是存在),您可能想要编写一个Must
- style 函数就像在template
包中一样,它会因返回的错误值而恐慌。
错误处理不是噪音。这不是杂乱。这不是你想要摆脱的东西。如果看起来你的程序的 50% 是错误处理,那是因为你的程序的 50% 是并且应该是错误处理。
- 3 回答
- 0 关注
- 499 浏览
添加回答
举报