首页 文章

重定向后停止代码执行

提问于
浏览
-6
//main.go
func (self *GoodsController) GoodsEditGet(w http.ResponseWriter, r *http.Request) {
    vars := mux.Vars(r)
    tmpID, ok := vars["id"]
    sess := session.Instance(w, r)

    if !ok {
        tpl.Error("Invalid goods id")
    }

    id, _ := strconv.ParseInt(tmpID, 10, 64)

    goods, err := service.NewGoodsService(w, r).GetGoodsDetail(id)

    if err != nil {
        //This utility function will not stop the rest of the code being executed
        util.RedirectWithMessage(w, r, err.Error(), "/system/inventory/goods")
    }

    //This line will be executed even though the above line producing error
    goodsUom, err := service.NewGoodsService(w, r).GetGoodsUom(id)

    if err != nil {
        util.RedirectWithMessage(w, r, err.Error(), "/system/inventory/goods")
    }

}

//package utility
func RedirectWithMessage(w http.ResponseWriter, r *http.Request, errMsg string, redirect string) {
    sess := session.Instance(w, r)
    sess.FlashError(errMsg)
    sess.FlashForm(r)
    sess.Save(r, w)
    http.Redirect(w, r, redirect, http.StatusFound)
    return
}

我是否知道如何在调用函数 RedirectWithMessage 后停止执行其余的代码?

return 放在该函数的末尾并没有执行其余的代码

我在Golang看起来相当于Php版本的重定向:

fuunction foo($location){
  header(“Location : $location”);
  exit();
}

 foo("/bar"):
 echo "blah"; //this will not be executed

Edited 过度热心的投票原因 .

是的我完全清楚我可以在调用 RedirectWithMessage 之后输入 return 语句 . 我只是不想用 return 语句将我的代码混乱到所有地方 . 相反我只是把它放在函数内部 . 我只是想知道有更好的解决方案吗?我可以实现像我显示的PHP代码一样的行为吗?

1 回答

  • 0

    我很想给你一个 panic defer 方式,并警告你不要使用它,但后来我意识到改变API可能会更好 .

    您可以聚焦函数的主要逻辑并将错误返回给调用者,并要求调用者以您希望的方式处理错误,例如:重定向,日志等 .

    func (self *GoodsController) GoodsEditGet(w http.ResponseWriter, r *http.Request) {
        err:=self.goodsEditGet(w,r)
        if err!=nil { //Note 1
            util.RedirectWithMessage(w, r, err.Error(), "/system/inventory/goods")
        }
    }
    
    func (self *GoodsController) goodsEditGet(w http.ResponsWriter, r *http.Request) {
        vars := mux.Vars(r)
        tmpID, ok := vars["id"]
        sess := session.Instance(w, r)
    
        if !ok {
            tpl.Error("Invalid goods id")
        }
    
        id, _ := strconv.ParseInt(tmpID, 10, 64)
    
        goods, err := service.NewGoodsService(w, r).GetGoodsDetail(id)
    
        if err != nil {
            //This utility function will not stop the rest of the code being executed
            return err //Note 2
        }
    
        goodsUom, err := service.NewGoodsService(w, r).GetGoodsUom(id)
    
        if err != nil {
            return err
        }
        return nil
    }
    

    注1:您可能希望处理更多指定的错误,而不仅仅是处理nil和非nil . 在这种情况下,类型断言可能是个好主意 .

    注意2:您可能希望包装错误 . 您可以尝试github/pkg/errors,这是一个处理由Dave Cheney编写的错误的好方法 .

    注3:建议不要使用 self 作为接收者名称,因为它非常模糊 .

相关问题