GO语言笔记4
正文
錯誤處理
package chapter3import ("errors""fmt""io/ioutil""log""net/http""os""strings" ) 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.StatusOKswitch {case os.IsNotExist(err):code=http.StatusNotFounddefault:code=http.StatusInternalServerError}http.Error(writer,http.StatusText(code),code)}} } func main(){http.HandleFunc("/list/",errWrapper(filehandle))http.ListenAndServe(":8888",nil)} const prefix="/list/" type userError string func(e userError)Error()string{return e.Message() } func (e userError)Message()string{return string(e) } func filehandle(writer http.ResponseWriter,request *http.Request)error {if strings.Index(request.URL.Path,prefix)!=0{return errors.New("path must start"+"with"+prefix)}path:=request.URL.Path[len("/list/"):]//統一錯誤處理file,err:=os.Open(path)if err!=nil{http.Error(writer,err.Error(),http.StatusInternalServerError)return}defer file.Close()all,err:=ioutil.ReadAll(file)if err!=nil{log.Printf("Error occurred"+"handling request:%s" ,err.Error())}if err!=nil{return err}writer.Write(all)return nil } //服務器統一錯誤處理func tryRecover(){defer func(){//錯誤處理的核心,在于recover函數,如果是已知的錯誤,可以把它recover如果是未知的錯誤,則要提示維護者。r:=recover()if err,ok:=r.(error);ok{fmt.Println("Error occurred:",err)}else{panic(fmt.Sprintf(" i dont know"))}}() }// error vs panic //defer panic recover總結
- 上一篇: Go语言笔记3
- 下一篇: 正式进驻1410实验室!