beego錯(cuò)誤處理

2023-11-20 18:06 更新

我們?cè)谧?Web 開(kāi)發(fā)的時(shí)候,經(jīng)常需要頁(yè)面跳轉(zhuǎn)和錯(cuò)誤處理,beego 這方面也進(jìn)行了考慮,通過(guò) Redirect 方法來(lái)進(jìn)行跳轉(zhuǎn):

func (this *AddController) Get() {
    this.Redirect("/", 302)
}

如何中止此次請(qǐng)求并拋出異常,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") 之后的代碼不會(huì)再執(zhí)行,而且會(huì)默認(rèn)顯示給用戶如下頁(yè)面:

beego 框架默認(rèn)支持 401、403、404、500、503 這幾種錯(cuò)誤的處理。用戶可以自定義相應(yīng)的錯(cuò)誤處理,例如下面重新定義 404 頁(yè)面:

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)
    beego.Router("/", &controllers.MainController{})
    beego.Run()
}

我們可以通過(guò)自定義錯(cuò)誤頁(yè)面 404.html 來(lái)處理 404 錯(cuò)誤。

beego 更加人性化的還有一個(gè)設(shè)計(jì)就是支持用戶自定義字符串錯(cuò)誤類型處理函數(shù),例如下面的代碼,用戶注冊(cè)了一個(gè)數(shù)據(jù)庫(kù)出錯(cuò)的處理頁(yè)面:

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()
}

一旦在入口注冊(cè)該錯(cuò)誤處理代碼,那么你可以在任何你的邏輯中遇到數(shù)據(jù)庫(kù)錯(cuò)誤調(diào)用 this.Abort("dbError") 來(lái)進(jìn)行異常頁(yè)面處理。

Controller 定義 Error

從 1.4.3 版本開(kāi)始,支持 Controller 方式定義 Error 錯(cuò)誤處理函數(shù),這樣就可以充分利用系統(tǒng)自帶的模板處理,以及 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"
}

通過(guò)上面的例子我們可以看到,所有的函數(shù)都是有一定規(guī)律的,都是 Error 開(kāi)頭,后面的名字就是我們調(diào)用 Abort 的名字,例如 Error404 函數(shù)其實(shí)調(diào)用對(duì)應(yīng)的就是 Abort("404")

我們就只要在 beego.Run 之前采用 beego.ErrorController 注冊(cè)這個(gè)錯(cuò)誤處理函數(shù)就可以了

package main

import (
    _ "btest/routers"
    "btest/controllers"

    "github.com/astaxie/beego"
)

func main() {
    beego.ErrorController(&controllers.ErrorController{})
    beego.Run()
}
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)