<small id='oSvqPJXC'></small> <noframes id='4dlnHYAMN'>

  • <tfoot id='Mnda39'></tfoot>

      <legend id='UkWBX'><style id='Mz1v9'><dir id='niD3x'><q id='lR1J'></q></dir></style></legend>
      <i id='tlgj9Q'><tr id='oMuxOqv'><dt id='s6xlV'><q id='Zd9O'><span id='hpjL'><b id='l2cu'><form id='qZld'><ins id='Y1rc7Mhpak'></ins><ul id='VifMh'></ul><sub id='dzIlw5V2q'></sub></form><legend id='IbUiXZgsn'></legend><bdo id='jKDS8'><pre id='9UFqhfX'><center id='t1nyv5'></center></pre></bdo></b><th id='RZk2'></th></span></q></dt></tr></i><div id='wNziTr'><tfoot id='ueNwB'></tfoot><dl id='2LVgQK'><fieldset id='KXw5k'></fieldset></dl></div>

          <bdo id='bXgF6x'></bdo><ul id='5KnCkmLN'></ul>

          1. <li id='ZmxrbIpUa'></li>
            登陆

            章鱼彩票安卓-争议最多的错误处理,Go 2 将会进行改善,如下草案你满足吗?

            admin 2019-09-06 296人围观 ,发现0个评论

            Go 2的总体方针是在辅佐工程扩展为大的代码基线时做到挥洒自如。

            一般,咱们的Go程序有许多过错查看,但短少过错处理。咱们一般运用如下代码所示的赋值判别句子进行过错查看。

            if _, err := io.Copy(w, r); nil != err {
            return err
            }

            这样写起来较繁琐,规划草案旨在引进一种轻量的语法来进行过错查看以处理当时的这些问题。

            1 当时问题

            Go 运用的是对显式过错成果的显式过错查看,而其他反常处理型言语(比如C++,C#,Java等)运用的是对隐式成果进行隐式查看。

            关于反常处理型言语的处理方法,因咱们全然看不到隐式查看,所以难以验证程序是否正确康复到查看失利时的状况。

            下面是一个过错查看较完好的文件复制代码,其过错处理的关键在于当io.Copy或w.Close失利时,应移除写了一半的dst文件。

            该代码较强健,但不行整齐,也不行高雅。

            2 方针

            削减很多过错查看代码,使过错查看更轻量,使过错处理更快捷。

            不重蹈反常处理的覆辙,过错查看及过错处理应持续坚持显式的方法。

            兼容现有代码。

            3 草案概览

            规划草案引进了两个新的关键字,check与handle,别离进行过错查看与过错处理。

            运用check f(x, y, z)或check err进行显式过错查看。

            运用hande句子进行过错处理器的界说。

            当过错查看失利时,其转向到最里面的Handler,最里面的Handler又转向到其上的下一个Handler,直至某一个Handler履行了return句子。

            例如,按照规划草案,如上代码能够改善为更简略的方法章鱼彩票安卓-争议最多的错误处理,Go 2 将会进行改善,如下草案你满足吗?:

            4 草案概况

            check

            check可用于error类型的表达式或许回来一组值且最终一个值为error类型的函数调用。

            给定变量v1, v2, ..., vN, vErr,

            v1, ..., vN := check /expr/

            其等价于:

            v1, ..., vN, vErr := /expr/
            if vErr != nil {
            /error result/ = handlerChain(vn)
            return
            }

            vErr有必要为error类型。

            相似,

            foo(check /expr/)

            等价于:

            v1, ..., vN, vErr := /expr/
            if vErr != nil {
            /error result/ = handlerChain(vn)
            return
            }
            foo(v1, ..., vN)

            如下是一段惯例的过错处理代码:

            其可被改写为:

            func printSum(a, b string) error {
            handle err { return err }
            fmt.Println("result:", check strconv.Atoi(x) + check strconv.Atoi(y))
            return nil
            }

            一般需求包装下过错信息的上下文,代码能够写作:

            func printSum(a, b string) error {
            handle err {
            return fmt.Errorf("printSum(%q + %q): %v", a, b, err)
            }
            fmt.Println("result:", check strconv.Atoi(x) + check strconv.Atoi(y))
            return nil
            }

            Handler

            Handler用来处理check所发现的过错,Handler运用return戚蓝尹句子能够使对应函数立刻退出。

            不带回来值的return仅可用于无回来值函数或变量声明式函数,对变量声明式函数,其回来这些变量的当时值。

            Handler链函数带一个error类型的参数且与对应函数的回来值界说相同。

            每个check对应哪个Handler链函数取决于check所界说的规模。

            拿如下代码举例:

            Check 1:在循环内,依序运转Handler C、B及A。不同于defer,界说在循环内的Handler不会因每次新的迭代而累积

            Check 2:在函数结尾,仅运转Handler A。

            几个重关键:

            check到过错,即会落入Handler,无法再回到对应函数的操控;

            Handler章鱼彩票安卓-争议最多的错误处理,Go 2 将会进行改善,如下草案你满足吗?履行总是在defer句子之前;

            若对应函数需求有回来值,但check的Handler链函数没有return句子会引起编译过错。章鱼彩票安卓-争议最多的错误处理,Go 2 将会进行改善,如下草案你满足吗?

            默许Handler

            默许Handler隐式界说在最终一个参数是error类型的函数的头部。

            依靠默许Handler,printSum函数能够写作:

            func printSum(a, b string) error {
            x := check strconv.Atoi(a)
            y := check strconv.Atoi(b)
            fmt.Println("result:", x + y)
            return nil
            }

            总结

            1)Handler

            a)仅需一个error类型的参数;

            b)与对应函数的回来参数相同。

            2)handle句子

            a)Handler运用return会将对应函数回来;

            b)对应函数运用参数声明式回来,一个空的return句子会回来这些参数的当时值。

            3)check表达式

            a)若check用在仅回来一个error值的函数前面,check会消费该值,且不会出产任何成果;

            b)一个check的Handler链会依Handler在当时效果的域的界说序的反序履行,直至某个Handler return;

            c)check表达式不行用于Handler。

            4)默许Handler

            a)对应函数非参数声明式回来,默许Handler会回来排头参数的0值及最终参数的error值;

            b)对应函数为参数声明式回来,默许Handler会回来排头参数的当时值及最终参数的error值;

            c)因默许Handler界说在函数头部,其是Handler链的最终一环。

            关键:

            Handler链调用相似于函数调用,check到过错的方位被保存为Handler的调用者栈帧。

            参考资料

            [1] https://github.com/golang/proposal/blob/master/design/go2draft-error-handling-overview.md

            [2] https://github.com/golang/proposal/blob/master/design/go2draft-error-handling.md

            原文链接:https://leileiluoluo.com/posts/go2-error-handling-draft-design.html

            本文作者:磊磊落落的博客,原创授权发布

            请关注微信公众号
            微信二维码
            不容错过
            Powered By Z-BlogPHP