7-3 服务器统一出错处理

代码:https://github.com/NIGHTFIGHTING/go_learning/tree/master/src/errhandling/filelistingserver

filelisting/handler.go

package filelisting

import (
    "net/http"
    "os"
    "io/ioutil"
)

func HandleFileList(writer http.ResponseWriter,
    request *http.Request) error {
    path := request.URL.Path[len("/list/"):] // /list/fib.txt
    file, err := os.Open(path)
    if err != nil {
        //panic(err)
        //http.Error(writer,
          //  err.Error(),
            //http.StatusInternalServerError)
        return err
    }
    defer file.Close()
    all, err := ioutil.ReadAll(file)
    if err != nil {
        //panic(err)
        return err
    }
    writer.Write(all)
    return nil
}

web.go

package main

import (
    "net/http"
    "os"
    "errhandling/filelistingserver/filelisting"
    "log"
)

type appHandler func(writer http.ResponseWriter,
    request *http.Request) error

func errWrapper(
    handler appHandler) func(
        http.ResponseWriter,*http.Request) {
    return func(writer http.ResponseWriter,
        request *http.Request) {
        err := handler(writer, request)
        if err != nil {
            log.Printf("Error handling request: %s",
                err.Error())
            code := http.StatusOK
            switch {
            case os.IsNotExist(err):
                code = http.StatusNotFound
            case os.IsPermission(err):
                code = http.StatusForbidden
            default:
                code = http.StatusInternalServerError
            }
            // 错误都写在writer里
            http.Error(writer,
                    http.StatusText(code),
                    code)
        }
    }
}

func main() {
    //http.HandleFunc("/list/errhandling/filelistingserver/web.go",
    http.HandleFunc("/",
       errWrapper(filelisting.HandleFileList))
    err := http.ListenAndServe(":8888", nil)
    if err != nil {
        panic(err)
    }
}
go run web.go

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值