国内最专业的IT技术学习网

UI设计

当前位置:主页 > UI设计 >

一文悟透备受争议的 Go 语言错误处理

发布时间:2019/09/19标签:   错误    点击量:

原标题:一文悟透备受争议的 Go 语言错误处理
写过 C 的同窗晓得,C 言语中经常前往整数过错码(errno)来表现函数处置犯错,平日用 -1 来表现过错,用 0 表现准确。而在 Go 中,咱们应用 error 范例来表现过错,不外它不再是一个整数范例,是一个接口范例:typeerrorinterface{Error()string}它表现那些能用一个字符串就能说清的过错。咱们最罕用的就是 errors.New() 函数,十分简略://src/errors/errors.gofuncNew(textstring)error{return&errorString{text}}typeerrorStringstruct{sstring}func(e*errorString)Error()string{returne.s}应用 New 函数创立进去的 error 范例现实上是 errors 包里未导出的 errorString 范例,它包括独一的一个字段 s,而且完成了独一的方式:Error() string。平日这就够了,它能反应事先“犯错了”,然而有些时间咱们须要愈加详细的信息,比方:funcSqrt(ffloat64)(float64,error){iff<0{return0,errors.New("math:squarerootofnegativenumber")}//implementation}当挪用者发觉犯错的时间,只晓得传入了一个正数出去,并不清晰究竟传的是甚么值。在 Go 里:Itistheerrorimplementation’sresponsibilitytosummarizethecontext.它请求前往这个过错的函数要给出详细的“高低文”信息,也就是说,在 Sqrt 函数里,要给出这个正数究竟是甚么。以是,假如发觉 f 小于 0,应当如许前往过错:iff<0{return0,fmt.Errorf("math:squarerootofnegativenumber%g",f)}这就用到了 fmt.Errorf 函数,它先将字符串格局化,再挪用 errors.New 函数来创立过错。当咱们想晓得过错范例,而且打印过错的时间,间接打印 error:fmt.Println(err)或许:fmt.Println(err.Error)fmt 包会主动挪用 err.Error() 函数来打印字符串。平日,咱们将 error 放到函数前往值的最初一个,没甚么好说的,各人都如许做,商定俗成。参考材料【Tony Bai】这篇文章提到,结构 error 的时间,请求传入的字符串首字母小写,开头不带标点标记,这是由于咱们常常会如许应用前往的 error:...err:=errors.New("errorexample")fmt.Printf("Thereturnederroris%s.\n",err)error 的困局InGo,errorhandlingisimportant.Thelanguage’sdesignandconventionsencourageyoutoexplicitlycheckforerrorswheretheyoccur(asdistinctfromtheconventioninotherlanguagesofthrowingexceptionsandsometimescatchingthem).在 Go 言语中,过错处置长短常主要的。它从言语层面请求咱们须要明白地处置碰到的过错。而不是像其余言语,类如 Java,应用 try-catch- finally 这类“花招”。这就形成代码里 “error” 满天飞,显得十分漫长拖拉。而为了代码硬朗性斟酌,关于函数前往的每一个过错,咱们都不能疏忽它。由于犯错的同时,很能够会前往一个 nil 范例的工具。假如错误过错停止推断,那下一行对 nil 工具的操纵百分之百会激发一个 panic。如许,Go 言语中诟病最多的就是它的过错处置方法仿佛回到了上古 C 言语时期。rr:=doStuff1()iferr!=nil{//handleerror...}err=doStuff2()iferr!=nil{//handleerror...}err=doStuff3()iferr!=nil{//handleerror...}

版权信息Copyright © 银河官网 版权所有    ICP备案编号:鲁ICP备09013610号