joh*_*nes 19 error-handling go chaining
我想在Go中创建一个链接API的方法.在所有示例中,我都可以发现链式操作似乎总能成功,我无法保证.因此,我尝试扩展这些以添加错误返回值.
如果我这样做的话
package main
import "fmt"
type Chain struct {
}
func (v *Chain)funA() (*Chain, error ) {
fmt.Println("A")
return v, nil
}
func (v *Chain)funB() (*Chain, error) {
fmt.Println("B")
return v, nil
}
func (v *Chain)funC() (*Chain, error) {
fmt.Println("C")
return v, nil
}
func main() {
fmt.Println("Hello, playground")
c := Chain{}
d, err := c.funA().funB().funC() // line 24
}
Run Code Online (Sandbox Code Playgroud)
编译器告诉我chain-err-test.go:24: multiple-value c.funA() in single-value context并且不会编译.有没有一个好方法,所以funcA,funcB和funcC可以报告错误并停止该链?
web*_*rc2 36
有没有一个好方法,所以funcA,funcB和funcC可以报告错误并停止该链?
不幸的是,不,你的问题没有很好的解决方案.解决方法非常复杂(添加错误通道等)成本超过增益.
方法链接不是Go中的习惯用法(至少不适用于可能出错的方法).这不是因为方法链有任何特别的错误,而是返回错误而不是恐慌的习惯用语的结果.其他答案是解决方法,但没有一个是惯用的.
我可以问一下,在Go中链接方法是不是惯用的,因为我们在Go中返回错误的结果,或者更常见的是多个方法返回的结果?
好问题,但不是因为Go支持多次退货.Python支持多个返回,Java也可以通过Tuple<T1, T2>类; 方法链在两种语言中都很常见.这些语言可以逃脱的原因是因为它们通过异常惯性地传达错误.异常立即停止方法链并跳转到相关的异常处理程序.这是Go开发人员通过选择返回错误而特别试图避免的行为.
你可以这样尝试:https : //play.golang.org/p/dVn_DGWt1p_H
package main
import (
"errors"
"fmt"
)
type Chain struct {
err error
}
func (v *Chain) funA() *Chain {
if v.err != nil {
return v
}
fmt.Println("A")
return v
}
func (v *Chain) funB() *Chain {
if v.err != nil {
return v
}
v.err = errors.New("error at funB")
fmt.Println("B")
return v
}
func (v *Chain) funC() *Chain {
if v.err != nil {
return v
}
fmt.Println("C")
return v
}
func main() {
c := Chain{}
d := c.funA().funB().funC()
fmt.Println(d.err)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8131 次 |
| 最近记录: |