Давайте немного настроим наше приложение, переместив часть кода обработки ошибок во вспомогательные методы. Это поможет разделить проблемы и избавиться от повторения кода по мере развития программы.

Добавьте новый файл helpers.go в папку cmd/web:

Премиум 👑 курс по Golang

Рекомендуем вам супер курс по Golang где собраны все материалы для качественного изучения языка. Удивите всех своими знаниями на собеседовании! 😎

Записаться на курс

Уроки, статьи и Видео

Мы публикуем в паблике ВК и Telegram качественные обучающие материалы для быстрого изучения Go. Подпишитесь на нас в ВК и в Telegram. Поддержите сообщество Go программистов.

Go в ВК Go в Telegram

И добавьте в него следующий код:

Здесь используется совсем немного кода, но вместе с тем вводится несколько новых элементов, которые стоит обсудить:

  • В помощнике serverError() мы используем функцию debug.Stack(), чтобы получить трассировку стека для текущей горутины и добавить ее в логгер. Возможность видеть полный путь к приложению через трассировку стека может быть полезна при отладке возникнувших ошибок;
  • В помощнике clientError() мы используем функцию http.StatusText() для автоматической генерации понятного человеку текстового представления для кода состояния HTTP. К примеру, http.StatusText(400) вернет строку "Bad Request";
  • Мы начали использовать специальные константы из пакета net/http для кодов состояния HTTP вместо целых чисел. В помощнике serverError() мы использовали константу http.StatusInternalServerError вместо 500, а в помощнике notFound() — константу http.StatusNotFound вместо записи 404.

Использование констант для кодов состояния HTTP является приятной особенностью, которая помогает сделать код понятным и самодокументируемым — особенно при работе с редко используемыми кодами состояния HTTP. Вы можете найти полный список констант кодов состояния по ссылке.

Как только все это будет сделано, вернитесь к файлу handlers.go и обновите его, для применения функций-помощников из helpers.go:

После обновления перезапустите веб-приложение и сделайте HTTP-запрос к http://127.0.0.1:4000 в браузере.

Это все должно привести к возникновению нашей специально оставленной ошибки из прошлого урока, и вы должны увидеть соответствующее сообщение об ошибке и трассировку стека в терминале:

Если вы внимательно посмотрите, то заметите небольшую проблему: название файла и номер строки, отображаемые в логе, как helpers.go:13 — это то место, откуда записывается сообщение об ошибке.

Но, зачем нам знать где находится помощник? Мы хотим знать где именно в работе программы возникла ошибка, а не место нахождения помощника который данную ошибку выводит!

В своих логах, мы хотим увидеть только название проблематичного файла и номер строки из трассировки стека, это даст более четкое представление о том, где возникла ошибка.

Это можно сделать, изменив немного код помощника serverError() чтобы он использовал логгер Output() и установив глубину вызова на 2 (она и так по умолчанию на 2). Снова откройте файл helpers.go и обновите его следующим образом:

Перезапустите веб-приложение из терминала. При повторной попытке перехода на http://127.0.0.1:4000 вы обнаружите, что нам сообщается соответствующее название файла и номер строки (handlers.go:24):

Исправляем ошибку из прошлого урока

На данный момент нам больше не нужна искусственная ошибка. Избавиться от нее можно следующий образом:

Если через терминал у вас не получается, то просто зайдите в папку html, найдите там файл home.page.bak и замените расширение .bak на .tmpl и всё!

Скачать готовый код

В конце каждого урока мы предоставляем готовый код веб-приложения который соответствует текущей статьи.

Скачать: snippetbox-13.zip