zoukankan      html  css  js  c++  java
  • Go通过闭包避免程序运行崩溃

    我们经常用的panic是会让程序挂掉,生产环境显然不合适,但是错误怎么避免,Go不像Java有try catch,在简洁的同时也有如何处理异常错误的问题。

    我们可以用闭包,闭包的思路就是不会改变外部的东西,也就是说我们处理了错误其实错误还是存在,只是使用了错误。

    举例

    func viewHandler(w http.ResponseWriter, r *http.Request) {
        imageId := r.FormValue("id")
        imagePath := UPLOAD_DIR + "/" + imageId
        if exists := isExists(imagePath); !exists {
            http.NotFound(w, r)
            return
        }
        w.Header().Set("Content-type", "iamge")
        http.ServeFile(w, r, imagePath)
    }

    这是一个handlefunc

    func safeHandler(fn http.HandlerFunc) http.HandlerFunc {
        return func(writer http.ResponseWriter, request *http.Request) {
            defer func() {
                if e, ok := recover().(error); ok {
                    http.Error(writer, e.Error(), http.StatusInternalServerError)
                }
            }()
            fn(writer, request)
        }
    }

    这是一个接受handlefunc的函数,把func传进去,处理err再返回一个func。这里闭包中调用了fn,同时加了一个defer专门处理err,是一个很不错的方式。

        http.HandleFunc("/view", safeHandler(viewHandler))

    这是如何使用。

    一个没有高级趣味的人。 email:hushui502@gmail.com
  • 相关阅读:
    js实现element中可清空的输入框(1)
    vue中v-model的学习
    Oracle触发器和MySQL触发器的简单应用
    Java中的多线程你只要看这一篇就够了()
    HTML 随笔记之 刷新页面
    HTML CSS 随笔记之 cursor
    float到底是干什么的?
    Spring Boot 事物的快速应用
    java web 中文乱码
    LVM 创建实例
  • 原文地址:https://www.cnblogs.com/CherryTab/p/12368923.html
Copyright © 2011-2022 走看看