亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

錯誤處理中間件拋出運行時錯誤

錯誤處理中間件拋出運行時錯誤

Go
DIEA 2023-05-22 15:47:08
我有這個錯誤處理中間件:func Error(next http.HandlerFunc) http.Handler {    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {        defer func() {            if err := recover(); err != nil {                log.Error("Caught error in defer/recover middleware: ", err)                originalError := err.(struct{ OriginalError error }).OriginalError                if originalError != nil {                    log.Error("Original error in defer/recover middleware: ", originalError)                }                statusCode := err.(struct{ StatusCode int }).StatusCode                if statusCode != 0 {                    w.WriteHeader(statusCode)                } else {                    w.WriteHeader(http.StatusInternalServerError)                }                message := err.(struct{ Message string }).Message                if message == "" {                    message = "Unknown error message."                }                json.NewEncoder(w).Encode(struct {                    ID string                }{                    message,                })            }        }()        next.ServeHTTP(w, r)    })}
查看完整描述

1 回答

?
躍然一笑

TA貢獻1826條經驗 獲得超6個贊

從錯誤消息來看,err對象類型runtime.errorString不是struct { OriginalError error }.?強制類型斷言會產生恐慌。

我認為最好在類型斷言期間使用第二個返回值,以檢查轉換過程是否成功。

if err := recover(); err != nil {


? ? if temp, ok := err.(struct{ OriginalError error }); ok {

? ? ? ? log.Error("Caught error in defer/recover middleware: ", err)

? ? ? ? originalError := temp.OriginalError


? ? ? ? if originalError != nil {

? ? ? ? ? ? log.Error("Original error in defer/recover middleware: ", originalError)

? ? ? ? }

? ? }


? ? if temp, ok := err.(struct{ StatusCode int }); ok {

? ? ? ? statusCode := temp.StatusCode


? ? ? ? if statusCode != 0 {

? ? ? ? ? ? w.WriteHeader(statusCode)

? ? ? ? } else {

? ? ? ? ? ? w.WriteHeader(http.StatusInternalServerError)

? ? ? ? }

? ? }


? ? if temp, ok := err.(struct{ Message string }); ok {

? ? ? ? message := temp.Message


? ? ? ? if message == "" {

? ? ? ? ? ? message = "Unknown error message."

? ? ? ? }


? ? ? ? json.NewEncoder(w).Encode(struct {

? ? ? ? ? ? ID string

? ? ? ? }{

? ? ? ? ? ? message,

? ? ? ? })

? ? }

}


查看完整回答
反對 回復 2023-05-22
  • 1 回答
  • 0 關注
  • 152 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號