真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

gobeego框架問(wèn)題怎么解決

這篇文章主要介紹了go beego框架問(wèn)題怎么解決的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇go beego框架問(wèn)題怎么解決文章都會(huì)有所收獲,下面我們一起來(lái)看看吧。

按需網(wǎng)站開(kāi)發(fā)可以根據(jù)自己的需求進(jìn)行定制,成都網(wǎng)站建設(shè)、成都網(wǎng)站制作構(gòu)思過(guò)程中功能建設(shè)理應(yīng)排到主要部位公司成都網(wǎng)站建設(shè)、成都網(wǎng)站制作的運(yùn)用實(shí)際效果公司網(wǎng)站制作網(wǎng)站建立與制做的實(shí)際意義

最近在項(xiàng)目中遇到了一個(gè)很奇怪的問(wèn)題:在整改日志規(guī)范時(shí),為了避免影響現(xiàn)有的代碼結(jié)構(gòu)以及改動(dòng)盡可能小的前提下,在調(diào)用記日志的SDK處將某一個(gè)字段值首字母改為大寫,代碼示例如下:

fmt.Println("--------SayHello begin------------")
 //項(xiàng)目中這里的a實(shí)際是作為參數(shù)傳入,只是可能為空串,不為空串,這樣寫肯定沒(méi)問(wèn)題
 a := ""
 b := strings.ToUpper(a[:1]) + a[1:]
 fmt.Println("b is ", b)
 fmt.Println("--------SayHello end------------")

 this.Ctx.Output.Body(this.Ctx.Input.RequestBody)

項(xiàng)目中這里的a變量其實(shí)是作為參數(shù)傳入,只是可能為空串。a變量不為空串時(shí),這樣寫肯定沒(méi)問(wèn)題。但是當(dāng)為空串時(shí),即""時(shí),就會(huì)出問(wèn)題,在java中,運(yùn)行的時(shí)候肯定會(huì)報(bào)一個(gè)“數(shù)組下表越界”的異常。小強(qiáng)將工程編譯后生成二進(jìn)制文件,放到服務(wù)器上跑,測(cè)試修改后的日志是否符合規(guī)范,驗(yàn)了一遍,沒(méi)有問(wèn)題,然后就將代碼提交了。

之后版本出來(lái)測(cè)試時(shí)發(fā)現(xiàn),有個(gè)奇怪的現(xiàn)象:接口不返回任何東西,狀態(tài)碼依然是 200 OK。這讓小強(qiáng)很納悶兒,還好,我們的小強(qiáng)經(jīng)驗(yàn)豐富,還是解決過(guò)大bug的人,然后就根據(jù)接口走了一遍代碼流程,眉頭一皺,就知道問(wèn)題所在了。原來(lái)就是a變量有時(shí)候傳進(jìn)來(lái)是空字符串,導(dǎo)致出現(xiàn)了slice下標(biāo)越界的panic,說(shuō)干就干,小強(qiáng)趕緊做了空串的判斷邏輯,重新驗(yàn)了一把,問(wèn)題就解決了。

原來(lái)問(wèn)題是這樣,項(xiàng)目中使用的beego版本是1.6.1版。

查到了beego的錯(cuò)誤處理流程:beego通過(guò)beego.App.Server.Handler處理所有的HTTP請(qǐng)求,在beego.Run()函數(shù)中,這個(gè)Handler就被設(shè)置為app.Handlers,可以參見(jiàn)beego1.6.1版本app.go的第95行:

app.Server.Handler = app.Handlers

而app在一開(kāi)始就被初始化,可以看app.go中的init()函數(shù),其中調(diào)用了NewApp()函數(shù):

// NewApp returns a new beego application.
func NewApp() *App {
 cr := NewControllerRegister()
 app := &App{Handlers: cr, Server: &http.Server{}}
 return app
}

可以看出,把cr賦值給Handler,其實(shí)cr是ControllerRegister類型,ControllerRegister類型實(shí)現(xiàn)了http.Handler接口,具體實(shí)現(xiàn)可以看router.go的第600行ServeHTTP方法。該方法中(第612行)有如下語(yǔ)句:

defer p.recoverPanic(context)

golang語(yǔ)言的錯(cuò)誤處理機(jī)制是,當(dāng)在某處調(diào)用panic(string)后,panic之后的語(yǔ)句將不再執(zhí)行,而是通過(guò)調(diào)用關(guān)系逐級(jí)退出,在每一級(jí)調(diào)用處都通過(guò)defer處理函數(shù)檢查是否panic被recover()函數(shù)捕獲處理,如果沒(méi)有則繼續(xù)往上扔panic信息,如果已經(jīng)被捕獲則結(jié)束此次panic過(guò)程,由捕獲panic的函數(shù)處繼續(xù)往下執(zhí)行。

出現(xiàn)異常會(huì)執(zhí)行recoverPanic方法,該方法中(第864行)有這樣的代碼段:

if BConfig.RunMode == DEV {
       showErr(err, context, stack)
}

showErr函數(shù)中會(huì)對(duì)錯(cuò)誤進(jìn)行模板渲染,而項(xiàng)目早在現(xiàn)網(wǎng)中投入使用,RunMode為prod,而非dev,所以recover()后不會(huì)有錯(cuò)誤提示。

當(dāng)RunMode為prod時(shí):

go beego框架問(wèn)題怎么解決

當(dāng)RunMode為prod時(shí):

go beego框架問(wèn)題怎么解決

dev模式好歹會(huì)返回錯(cuò)誤信息:slice bounds out of range

prod模式?jīng)]有任何提示。下標(biāo)越界這種問(wèn)題看似簡(jiǎn)單,但是真正遇到了有時(shí)候也會(huì)摸不著頭腦。

關(guān)于“go beego框架問(wèn)題怎么解決”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“go beego框架問(wèn)題怎么解決”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


文章名稱:gobeego框架問(wèn)題怎么解決
URL分享:http://weahome.cn/article/jecsds.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部