beego通過Redirect方法來進行跳轉:
func (this *AddController) Get() { this.Redirect("/", 302) }
如何終止此次請求並拋出異常,beego可以在控制器中這樣操作:
func (this *MainController) Get() { this.Abort("401") v := this.GetSession("asta") if v == nil { this.SetSession("asta", int(1)) this.Data["Email"] = 0 } else { this.SetSession("asta", v.(int)+1) this.Data["Email"] = v.(int) } this.TplName = "index.tpl" }
這樣 this.Abort("401")
之后的代碼不會再執行,而且會默認顯示給用戶如下頁面:
beego 框架默認支持 401、403、404、500、503 這幾種錯誤的處理。用戶可以自定義相應的錯誤處理,例如下面重新定義 404 頁面:
//定義處理404錯誤的函數
func page_not_found(rw http.ResponseWriter, r *http.Request){ t,_:= template.New("404.html").ParseFiles(beego.BConfig.WebConfig.ViewsPath+"/404.html") data :=make(map[string]interface{}) data["content"] = "page not found" t.Execute(rw, data) } func main() { beego.ErrorHandler("404",page_not_found) //如果是404錯誤返回什么 beego.Router("/", &controllers.MainController{}) //正常跳轉 beego.Run() }
我們可以通過自定義錯誤頁面 404.html
來處理 404 錯誤。
beego 更加人性化的還有一個設計就是支持用戶自定義字符串錯誤類型處理函數,
例如下面的代碼,用戶注冊了一個數據庫出錯的處理頁面:
func dbError(rw http.ResponseWriter, r *http.Request){ t,_:= template.New("dberror.html").ParseFiles(beego.BConfig.WebConfig.ViewsPath+"/dberror.html") data :=make(map[string]interface{}) data["content"] = "database is now down" t.Execute(rw, data) } func main() { beego.ErrorHandler("dbError",dbError) beego.Router("/", &controllers.MainController{}) beego.Run() }
一旦在入口注冊該錯誤處理代碼,那么你可以在任何你的邏輯中遇到數據庫錯誤調用 this.Abort("dbError")
來進行異常頁面處理。
Controller定義Error
從 1.4.3 版本開始,支持 Controller 方式定義 Error 錯誤處理函數,這樣就可以充分利用系統自帶的模板處理,以及 context 等方法。
package controllers import ( "github.com/astaxie/beego" ) type ErrorController struct { beego.Controller } func (c *ErrorController) Error404() { c.Data["content"] = "page not found" c.TplName = "404.tpl" } func (c *ErrorController) Error501() { c.Data["content"] = "server error" c.TplName = "501.tpl" } func (c *ErrorController) ErrorDb() { c.Data["content"] = "database is now down" c.TplName = "dberror.tpl" }
通過上面的例子我們可以看到,所有的函數都是有一定規律的,都是 Error
開頭,后面的名字就是我們調用 Abort
的名字,
例如 Error404
函數其實調用對應的就是 Abort("404")。
我們就只要在 beego.Run
之前采用 beego.ErrorController
注冊這個錯誤處理函數就可以了
package main import ( _ "btest/routers" "btest/controllers" "github.com/astaxie/beego" ) func main() { beego.ErrorController(&controllers.ErrorController{}) beego.Run() }