8.3 服务器统一出错处理

一、进行统一错误处理

  1. 实现统一错误逻辑处理方法

    使用http请求读取文件的方式进行错误的处理

    包括文件不存在,文件没有权限读等

    // 主方法
    package main
    
    import (
    	"imooc-learn/8/filelistingserver/filelisting"
    	"net/http"
    	"os"
    )
    
    // 定义访问的方法
    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.Warn("Error handling request: %s", err.Error())
    			code := http.StatusOK
    
    			switch {
                // 未找到 404
    			case os.IsNotExist(err):
    				code = http.StatusNotFound
                // 没有权限 401
    			case os.IsPermission(err):
    				code = http.StatusUnauthorized
                // 其他错误 500
    			default:
    				code = http.StatusInternalServerError
    			}
                // 错误输出
    			http.Error(writer, http.StatusText(code), code)
    		}
    	}
    }
    
    func main() {
    
    	http.HandleFunc("/list/", errWrapper(filelisting.HandleFileList))
    
    	err := http.ListenAndServe(":8888", nil)
    	if err != nil {
    		panic(err)
    	}
    }
    
    
    // 拦截请求的方法
    package filelisting
    
    import (
    	"io/ioutil"
    	"net/http"
    	"os"
    )
    
    func HandleFileList(writer http.ResponseWriter, request *http.Request) error {
    	path := request.URL.Path[len("/list/"):]
    	file, err := os.Open(path)
    	if err != nil {
    		return err
    	}
    	defer file.Close()
    
    	all, err := ioutil.ReadAll(file)
    	if err != nil {
    		return err
    	}
    
    	writer.Write(all)
    
    	return nil
    }

Last updated

Was this helpful?