gpt4 book ai didi

web-applications - 基于 go 的 Web 应用程序中的错误页面

转载 作者:IT王子 更新时间:2023-10-29 01:25:40 28 4
gpt4 key购买 nike

我们正在使用 go 构建一个网站,只使用内置的东西,比如 http.HandleFunc 来设置路由和 html.template 包来呈现页面。没什么特别的,而且效果很好。现在我开始考虑错误处理,并想捕捉 panic 和诸如此类的东西并重定向到静态错误页面。最好的方法是什么?

我首先考虑的蛮力方法是在检测到错误时进行重定向,但如果使用通用的包罗万象也不错。我没有在文档中找到任何关于它的内容。

(同样考虑 404。)

最佳答案

golang 博客上有一篇关于错误处理的精彩文章,最后专门介绍了与网络相关的错误。

http://blog.golang.org/2011/07/error-handling-and-go.html

基本上,您使用自己的可以返回错误的常规 http 处理程序进行包装。包装器检查您的新处理程序是否返回错误,如果是则使用react。我使用与此类似的东西,我也称之为恢复。这是我使用的代码片段(免费且开放)。

虽然我还没有为错误提供自定义页面,但它一直在我的脑海中,应该很容易添加。

// Error is the expected return of a dae.Handler, or nil otherwise.
type Error struct {
Error error
Code int
Message string
}

// NewError is a helper for creating an Error pointer.
func NewError(err error, code int, msg string) *Error {
return &Error{err, code, msg}
}

// Handler is used to cast functions to its type to implement ServeHTTP.
// Code that panics is automatically recovered and delivers a server 500 error.
type Handler func(http.ResponseWriter, *http.Request) *Error

// NewHandler is a helper to chain multiple functions together.
func New(fn ...Handler) Handler {
if len(fn) == 0 {
panic("No Handlers passed in.")
}

h := Handler(fn[0])
for i := 1; i < len(fn); i++ {
h = h.Add(fn[i])
}
return h
}

// ServeHTTP implements the http.Handler interface. If an appHandler returns an
// error, the error is inspected and an appropriate response is written out.
func (fn Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
defer func() {
if r := recover(); r != nil {
log.Printf("%v", r)
http.Error(w, "A serious error has occured.", 500)
if Debug {
panic(r.(error))
}
}
}()

if e := fn(w, r); e != nil {
log.Printf("Code: %v, Message: \"%s\", Error: %v", e.Code, e.Message, e.Error)
switch e.Code {
case 500:
http.Error(w, e.Message, e.Code)
case 404:
http.NotFound(w, r)
fmt.Fprint(w, e.Message)
case 200:
fmt.Fprint(w, e.Message)
}
}
}

关于web-applications - 基于 go 的 Web 应用程序中的错误页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13822150/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com