一、错误处理示例:
_, err := os.Open("c.txt")
if err != nil {
if pathError, ok := err.(*os.PathError); ok{
fmt.Println(pathError.Err)
} else {
fmt.Println("unknuown error", err)
}
}
二、创建error示例:
err = errors.New("unknown error")
三、自定义error示例:
type myfError struct {
message string
}
func (err *myfError) Error() string{
return err.message
}
四、统一的错误处理逻辑
1.在业务处理函数中直接将错误返回,示例如下:
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
}
2.在业务处理函数外层包装一层专门用来处理错误,示例如下:
type appHandler func(writer http.ResponseWriter, request *http.Request) error
func errWrapper(handler appHandler) func(writer http.ResponseWriter, request *http.Request) {
return func(writer http.ResponseWriter, request *http.Request) {
err := handler(writer, request)
if err != nil {
code := http.StatusOK
switch {
case os.IsNotExist(err):
code = http.StatusNotFound
case os.IsPermission(err):
code = http.StatusForbidden
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)
}
}