91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

go beego框架問題怎么解決

發布時間:2022-05-20 15:00:58 來源:億速云 閱讀:156 作者:iii 欄目:大數據

這篇文章主要介紹了go beego框架問題怎么解決的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇go beego框架問題怎么解決文章都會有所收獲,下面我們一起來看看吧。

最近在項目中遇到了一個很奇怪的問題:在整改日志規范時,為了避免影響現有的代碼結構以及改動盡可能小的前提下,在調用記日志的SDK處將某一個字段值首字母改為大寫,代碼示例如下:

fmt.Println("--------SayHello begin------------")
 //項目中這里的a實際是作為參數傳入,只是可能為空串,不為空串,這樣寫肯定沒問題
 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)

項目中這里的a變量其實是作為參數傳入,只是可能為空串。a變量不為空串時,這樣寫肯定沒問題。但是當為空串時,即""時,就會出問題,在java中,運行的時候肯定會報一個“數組下表越界”的異常。小強將工程編譯后生成二進制文件,放到服務器上跑,測試修改后的日志是否符合規范,驗了一遍,沒有問題,然后就將代碼提交了。

之后版本出來測試時發現,有個奇怪的現象:接口不返回任何東西,狀態碼依然是 200 OK。這讓小強很納悶兒,還好,我們的小強經驗豐富,還是解決過大bug的人,然后就根據接口走了一遍代碼流程,眉頭一皺,就知道問題所在了。原來就是a變量有時候傳進來是空字符串,導致出現了slice下標越界的panic,說干就干,小強趕緊做了空串的判斷邏輯,重新驗了一把,問題就解決了。

原來問題是這樣,項目中使用的beego版本是1.6.1版。

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

app.Server.Handler = app.Handlers

而app在一開始就被初始化,可以看app.go中的init()函數,其中調用了NewApp()函數:

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

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

defer p.recoverPanic(context)

golang語言的錯誤處理機制是,當在某處調用panic(string)后,panic之后的語句將不再執行,而是通過調用關系逐級退出,在每一級調用處都通過defer處理函數檢查是否panic被recover()函數捕獲處理,如果沒有則繼續往上扔panic信息,如果已經被捕獲則結束此次panic過程,由捕獲panic的函數處繼續往下執行。

出現異常會執行recoverPanic方法,該方法中(第864行)有這樣的代碼段:

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

showErr函數中會對錯誤進行模板渲染,而項目早在現網中投入使用,RunMode為prod,而非dev,所以recover()后不會有錯誤提示。

當RunMode為prod時:

go beego框架問題怎么解決

當RunMode為prod時:

go beego框架問題怎么解決

dev模式好歹會返回錯誤信息:slice bounds out of range

prod模式沒有任何提示。下標越界這種問題看似簡單,但是真正遇到了有時候也會摸不著頭腦。

關于“go beego框架問題怎么解決”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“go beego框架問題怎么解決”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

纳雍县| 公主岭市| 赤壁市| 武夷山市| 清流县| 浦县| 光山县| 徐汇区| 孙吴县| 习水县| 乐陵市| 清河县| 三亚市| 德阳市| 怀仁县| 荆门市| 无棣县| 久治县| 曲松县| 宁安市| 岗巴县| 阳原县| 老河口市| 嵊泗县| 汶上县| 崇左市| 惠州市| 合作市| 中卫市| 自贡市| 兴仁县| 筠连县| 成都市| 进贤县| 黔南| 伊通| 砚山县| 万安县| 北海市| 石台县| 锦屏县|