Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Как не утонуть в ошибках

Как не утонуть в ошибках

Iskander (Alex) Sharipov

January 05, 2019
Tweet

More Decks by Iskander (Alex) Sharipov

Other Decks in Programming

Transcript

  1. Напишем простой handler загрузки файла • Берем файл из запроса

    • Создаем папку, куда хотим сохранить файл • Создаем итоговый файл • Записываем в итоговый файл данные из запроса 2
  2. 4

  3. func uploadFile(w http.ResponseWriter, r *http.Request) { file, header, err :=

    r.FormFile("file") if err != nil { http.Error(w, "Unable to read file", 400) return } 5
  4. func uploadFile(w http.ResponseWriter, r *http.Request) { file, header, err :=

    r.FormFile("file") if err != nil { http.Error(w, "Unable to read file", 400) return } os.MkdirAll("/path/", 0666) 6
  5. 7

  6. func uploadFile(w http.ResponseWriter, r *http.Request) { file, header, err :=

    r.FormFile("file") if err != nil { http.Error(w, "Unable to read file", 400) return } err = os.MkdirAll("/path/", 0666) if err != nil { http.Error(w, "Unable to create folder", 500) return } 8
  7. 10

  8. resultFile, err := os.Create("/path/" + header.Filename) if err != nil

    { http.Error(w, err.Error(), 500) return } defer resultFile.Close() 11
  9. resultFile, err := os.Create("/path/" + header.Filename) if err != nil

    { http.Error(w, err.Error(), 500) return } defer resultFile.Close() io.Copy(resultFile, file) 12
  10. resultFile, err := os.Create("/path/" + header.Filename) if err != nil

    { http.Error(w, err.Error(), 500) return } defer resultFile.Close() _, err = io.Copy(resultFile, file) if err != nil { http.Error(w, err.Error(), 500) return } 14
  11. func uploadFile(w http.ResponseWriter, r *http.Request) { file, header, err :=

    r.FormFile("file") if err != nil { http.Error(w, "Unable to read file", 400) return } err = os.MkdirAll("/path/", 0666) if err != nil { http.Error(w, "Unable to create folder", 500) return } resultFile, err := os.Create("/path/" + header.Filename) if err != nil { http.Error(w, err.Error(), 500) return } defer resultFile.Close() _, err = io.Copy(resultFile, file) if err != nil { http.Error(w, err.Error(), 500) return } } 15
  12. 16

  13. func uploadFile(w http.ResponseWriter, r *http.Request) { file, header := r.FormFile("file")

    os.MkdirAll("/path/", 0666) resultFile := os.Create("/path/" + header.Filename) defer resultFile.Close() io.Copy(resultFile, file) } 17
  14. func uploadFile(w http.ResponseWriter, r *http.Request) { file, header := r.FormFile("file")

    os.MkdirAll("/path/", 0666) resultFile := os.Create("/path/" + header.Filename) defer resultFile.Close() io.Copy(resultFile, file) } if err != nil if err != nil if err != nil if err != nil if err != nil if err != nil if err != nil if err != nil if err != nil if err != nil 18
  15. type appError struct { Error error Message string Code int

    } type appHandler func(http.ResponseWriter, *http.Request) *appError func (fn appHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { if e := fn(w, r); e != nil { http.Error(w, e.Message, e.Code) } } func init() { http.Handle("/upload", appHandler(uploadFile)) } 21
  16. func uploadFile(w http.ResponseWriter, r *http.Request) *appError { file, header, err

    := r.FormFile("file") if err != nil { return &appError{err, "Unable to read file", 400} } err = os.MkdirAll("/path/", 0666) if err != nil { return &appError{err, "Unable to create folder", 500} } //... 22
  17. type uploader struct { err error } func (u *uploader)

    getFile(r *http.Request) (File, *FileHeader) { file, header, err := r.FormFile("file") return file, header } 24
  18. type uploader struct { err error } func (u *uploader)

    getFile(r *http.Request) (File, *FileHeader) { if u.err != nil { return nil, nil } file, header, err := r.FormFile("file") if err != nil { u.err = errors.Wrap(err, "Unable to read file") } return file, header } 25
  19. func (u *uploader) mkdir(uploadDir string) { if u.err != nil

    { return } err := os.MkdirAll(uploadDir, 0666) if err != nil { u.err = errors.Wrap(err, "Unable to create folder") } } func (u *uploader) copy(dst io.Writer, src io.Reader) { if u.err != nil { return } if _, err := io.Copy(dst, src); err != nil { u.err = err } } 26
  20. func (u *uploader) createFile(filePath string) *os.File { if u.err !=

    nil { return nil } resultFile, err := os.Create(filePath) if err != nil { u.err = err } return resultFile } 27
  21. func uploadFile(w http.ResponseWriter, r *http.Request) { u := uploader{} file,

    header := u.getFile(r) u.mkdir("/path/") resultFile := u.createFile("/path/" + header.Filename) u.copy(resultFile, file) if u.err != nil { http.Error(w, fu.err.Error(), 500) return } } 28
  22. Полезные ссылки Немного про ошибки - https://golang.org/doc/effective_go.html#errors Обработка ошибок в

    блоге - https://blog.golang.org/error-handling-and-go Доклад John Cinnamond - https://youtu.be/1B71SL6Y0kA Пакет errors - https://golang.org/pkg/errors/ 31