lai*_*e9m 19 error-handling go panic
Go提供了两种处理错误的方法,但我不确定使用哪种方法.
假设我正在实现一个ForEach
接受切片或地图作为参数的经典函数.要检查是否传入了iterable,我可以这样做:
func ForEach(iterable interface{}, f interface{}) {
if isNotIterable(iterable) {
panic("Should pass in a slice or map!")
}
}
Run Code Online (Sandbox Code Playgroud)
要么
func ForEach(iterable interface{}, f interface{}) error {
if isNotIterable(iterable) {
return fmt.Errorf("Should pass in a slice or map!")
}
}
Run Code Online (Sandbox Code Playgroud)
我看到一些讨论说panic()
应该避免,但人们也说如果程序无法从错误中恢复,你应该panic()
.
我应该使用哪一个?选择正确的主要原则是什么?
Adr*_*ian 30
来自Dave Cheney:
panics
对你的程序来说总是致命的.在惊慌中你永远不会认为你的来电者可以解决问题.因此panic
,仅用于特殊情况,代码无法使用的情况,或任何集成代码的人继续使用.
你应该假设对于整个程序,或者至少对于当前的goroutine来说,恐慌将立即致命.问问自己"当这种情况发生时,应用程序是否会立即崩溃?" 如果是,请使用恐慌; 否则,使用错误.
dol*_*men 12
使用panic
.
因为您的用例是捕获 API 的不当使用。如果程序正确调用您的 API,则在运行时永远不会发生这种情况。
事实上,如果测试被删除,任何使用正确参数调用 API 的程序都会以相同的方式运行。测试只是在早期失败并显示有助于犯错误的程序员的错误消息。理想情况下,在开发过程中运行测试套件时可能会出现一次恐慌,程序员甚至会在提交错误代码之前修复调用,并且错误使用永远不会到达生产环境。
另请参阅此对问题的回复是否使用错误进行函数参数验证是 Go 中的一个好模式?.
归档时间: |
|
查看次数: |
8457 次 |
最近记录: |