Exception 错误是值(blog)-逻辑上相同吗?
我刚读了罗伯·派克写的那本书。关于这一点,我有一个小问题,可能我也可能是错的,但我仍然希望得到反馈,并正确理解这一过程 在博客中有一段代码片段(实际上是由@jxck\ux编写的) a) 根据我的理解,如果在Exception 错误是值(blog)-逻辑上相同吗?,exception,error-handling,exception-handling,go,Exception,Error Handling,Exception Handling,Go,我刚读了罗伯·派克写的那本书。关于这一点,我有一个小问题,可能我也可能是错的,但我仍然希望得到反馈,并正确理解这一过程 在博客中有一段代码片段(实际上是由@jxck\ux编写的) a) 根据我的理解,如果在fd.Write(p0[a:b])发生错误,上述代码将返回,并且永远不会执行fd.Write(p1[c:d]),对吗 罗伯建议写这样的东西 var err error write := func(buf []byte) { if err != nil { return
fd.Write(p0[a:b])
发生错误,上述代码将返回,并且永远不会执行fd.Write(p1[c:d])
,对吗
罗伯建议写这样的东西
var err error
write := func(buf []byte) {
if err != nil {
return
}
_, err = w.Write(buf)
}
write(p0[a:b])
write(p1[c:d])
write(p2[e:f])
// and so on
if err != nil {
return err
}
b) 基于上述情况,看起来该错误将从子函数返回。这意味着如果错误发生在写入时(p0[a:b]),那么它仍然会执行写入操作(p1[c:d]),对吗?这就意味着从逻辑上来说两者是不一样的,对吗
任何人都可以解释。不,他们是一样的。如果
错误
发生在fd.Write(p0[a:b])
处,则err
变量将保留其值
现在,如果调用write(p1[c:d])
,那么write()
func将首先检查err!=nil
但由于它已经存储了上次调用中发生的错误
,因此它将立即返回,并且不会执行进一步的代码。a)是的,您是正确的。如果错误发生在第一次写入中,它将返回
b) 否。本例中的
写入
是一个错误。内部的err
与外部的作用域相同。因此,如果第一次写入失败,另一个将直接返回,因为外部的err
不再是nil
。两个版本在执行的操作方面并不完全相同,因为原始版本在发生错误时使用提前返回,而第二个版本在调用write闭包时检查nil的次数相同。
var err error
write := func(buf []byte) {
if err != nil {
return
}
_, err = w.Write(buf)
}
write(p0[a:b])
write(p1[c:d])
write(p2[e:f])
// and so on
if err != nil {
return err
}