# 錯誤處理
我們在做 Web 開發的時候,經常需要頁面跳轉和錯誤處理,beego 這方面也進行了考慮,通過 `Redirect` 方法來進行跳轉:
```go
func (this *AddController) Get() {
this.Redirect("/", 302)
}
```
如何中止此次請求并拋出異常,beego 可以在控制器中這樣操作:
```go
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 頁面:
```go
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()
}
```
我們可以通過自定義錯誤頁面 `404.html` 來處理 404 錯誤。
beego 更加人性化的還有一個設計就是支持用戶自定義字符串錯誤類型處理函數,例如下面的代碼,用戶注冊了一個數據庫出錯的處理頁面:
```go
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()
}
```
- beego簡介
- 為 beego 貢獻
- 發布版本
- 升級指南
- beego安裝升級
- Bee 工具的使用
- 快速入門
- 新建項目
- 路由設置
- Controller 運行機制
- model 邏輯
- view 編寫
- 靜態文件處理
- beego 的 MVC 架構介紹
- controller 設計
- 參數配置
- 路由設置
- 控制器函數
- XSRF 過濾
- 請求數據處理
- session 控制
- 過濾器
- flash 數據
- URL構建
- 多種格式數據輸出
- 表單數據驗證
- 錯誤處理
- 日志處理
- model設計
- 概述
- ORM 使用
- CRUD 操作
- 高級查詢
- 原生 SQL 查詢
- 構造查詢
- 事務處理
- 模型定義
- 命令模式
- 測試用例
- 自定義字段
- FAQ
- view 設計
- 模板語法指南
- 模板處理
- 模板函數
- 靜態文件處理
- 模板分頁處理
- beego 的模塊設計
- session 模塊
- grace 模塊
- cache 模塊
- logs 模塊
- httplib 模塊
- context 模塊
- toolbox 模塊
- config 模塊
- i18n 模塊
- beego 高級編程
- 進程內監控
- API 自動化文檔
- 應用部署
- 獨立部署
- supervisor 部署
- Nginx 部署
- apache 部署
- beego 第三方庫
- 應用例子
- 在線聊天室
- 短域名服務
- Todo 列表
- beego實用庫
- 驗證碼
- 分頁
- FAQ