Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 210новых вакансий за сутки·93 612вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 266
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 401 кандидат открыт к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python17 126
  • Облачные технологии14 083
  • QA вакансии3 456
  • Backend вакансии2 115
  • Инженер данных1 809
  • Продакт-менеджер1 261

Разработка

  • Android1 862
  • iOS1 700
  • Fullstack вакансии986
  • AI вакансии950
  • Frontend вакансии744
  • Mobile вакансии44

По стеку

  • Go8 688
  • Java6 537
  • Node.js2 026
  • .NET1 722
  • Kotlin1 611
  • Rust1 458
  • C#710
  • PHP682
  • C++571

DevOps и инфраструктура

  • Kubernetes7 772
  • DevOps вакансии6 054
  • Linux-инфраструктура5 493
  • Terraform / IaC4 275
  • CI/CD3 239
  • Мониторинг и Observability1 790
  • SRE568
  • Кибербезопасность458

Аналитика и данные

  • Data Scientist1 143
  • Бизнес-аналитик923
  • Аналитик данных857
  • Системный аналитик152

Другие направления

  • Проджект-менеджер620
  • UI/UX дизайн146
  • Ручное тестирование14

По регионам

  • Вакансии в США44 276
  • Вакансии в Европе23 819
  • Вакансии в Канаде4 471
  • Работа в России3 904

По формату

  • Удалённые вакансии74 928
  • Релокация в США44 273
  • Гибридная работа12 388
  • Офисная работа7 083

По уровню

  • Senior вакансии42 625
  • Middle вакансии20 854
  • Junior вакансии6 721

Сейчас нанимают

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis39 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме FiberВсе вопросы
FiberMiddleТеория

Как работает обработка ошибок в Fiber? Что такое custom error handler?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Возвращайте ошибки из обработчиков через return err или fiber.NewError(status, msg). Кастомный error handler задаётся в fiber.Config{ErrorHandler: fn} и централизованно управляет форматом всех HTTP-ошибок. Используйте errors.As для типизированной обработки.

Встроенный механизм

По умолчанию Fiber обрабатывает ошибки типа *fiber.Error и стандартные ошибки Go. Если вернуть обычную ошибку — статус будет 500. Для HTTP-ошибок используйте fiber.NewError(statusCode, message):

app.Get("/users/:id", func(c *fiber.Ctx) error {
	id, err := c.ParamsInt("id")
	if err != nil {
		return fiber.NewError(fiber.StatusBadRequest, "id must be integer")
	}
	if id == 0 {
		return fiber.ErrNotFound // предустановленная ошибка 404
	}
	return c.JSON(fiber.Map{"id": id})
})

Обработка ошибок в Fiber

Fiber использует единую точку обработки ошибок — error handler. Любой обработчик или middleware может вернуть ошибку через return err, и Fiber передаст её в зарегистрированный error handler. Это позволяет централизовать логирование, форматирование и коды ответов.

Кастомный Error Handler

Кастомный error handler задаётся в fiber.Config при создании приложения. Он получает *fiber.Ctx и error, и должен сформировать финальный ответ клиенту:

package main

import (
	"errors"
	"log"

	"github.com/gofiber/fiber/v2"
)

// Кастомный тип ошибки
type AppError struct {
	Code    int    `json:"code"`
	Message string `json:"message"`
	Details string `json:"details,omitempty"`
}

func (e *AppError) Error() string {
	return e.Message
}

func customErrorHandler(c *fiber.Ctx, err error) error {
	// Определяем HTTP-статус
	code := fiber.StatusInternalServerError
	msg := "internal server error"
	details := ""

	// fiber.Error — HTTP-ошибка с явным статусом
	var fiberErr *fiber.Error
	if errors.As(err, &fiberErr) {
		code = fiberErr.Code
		msg = fiberErr.Message
	}

	// AppError — доменная ошибка приложения
	var appErr *AppError
	if errors.As(err, &appErr) {
		code = appErr.Code
		msg = appErr.Message
		details = appErr.Details
	}

	// Логируем 5xx
	if code >= 500 {
		log.Printf("ERROR [%s %s]: %v", c.Method(), c.Path(), err)
	}

	// Устанавливаем Content-Type явно
	c.Set(fiber.HeaderContentType, fiber.MIMEApplicationJSONCharsetUTF8)

	return c.Status(code).JSON(fiber.Map{
		"error":   msg,
		"details": details,
		"path":    c.Path(),
	})
}

func main() {
	app := fiber.New(fiber.Config{
		ErrorHandler: customErrorHandler,
	})

	app.Get("/ok", func(c *fiber.Ctx) error {
		return c.JSON(fiber.Map{"status": "ok"})
	})

	app.Get("/fail", func(c *fiber.Ctx) error {
		return &AppError{Code: 422, Message: "validation failed", Details: "field 'name' is required"}
	})

	app.Get("/crash", func(c *fiber.Ctx) error {
		return errors.New("unexpected database error")
	})

	log.Fatal(app.Listen(":3000"))
}

Предустановленные ошибки Fiber

fiber.ErrBadRequest          // 400
fiber.ErrUnauthorized        // 401
fiber.ErrForbidden           // 403
fiber.ErrNotFound            // 404
fiber.ErrMethodNotAllowed    // 405
fiber.ErrRequestEntityTooLarge // 413
fiber.ErrUnprocessableEntity // 422
fiber.ErrTooManyRequests     // 429
fiber.ErrInternalServerError // 500
fiber.ErrServiceUnavailable  // 503

Совместная работа с middleware recover

Middleware recover перехватывает паники и конвертирует их в вызов error handler с ошибкой 500. Убедитесь, что recover зарегистрирован первым:

import "github.com/gofiber/fiber/v2/middleware/recover"

app.Use(recover.New(recover.Config{
	EnableStackTrace: true,
}))
// Другие middleware после recover...

Подводные камни

  • Возврат nil после c.JSON: Если в обработчике не вернуть ошибку (return nil), но до этого уже вызвать c.JSON, ответ будет отправлен. Двойной вызов записи в ответ приведёт к ошибке fasthttp. Всегда используйте return c.JSON(...).
  • Error handler не вызывается для app.Use без Next: Если middleware вернул ошибку через return err, но c.Next() не был вызван, error handler всё равно сработает. Но если middleware отправил ответ и вернул nil — error handler не вызовется даже при логической ошибке.
  • errors.As vs прямое приведение: Используйте errors.As вместо type assertion — это корректно работает с цепочками ошибок (wrapping через fmt.Errorf("%w", err)).
  • Статус 200 при ошибке: Если в error handler забыть вызвать c.Status(code) перед JSON — ответ уйдёт со статусом 200, несмотря на тело ошибки.
  • Повторная запись заголовков: После того как ответ начал отправляться (headers committed), нельзя изменить статус. Убедитесь, что error handler вызывается до любой отправки данных.
  • Goroutine и ошибки: Ошибки из горутин, запущенных внутри обработчика, не попадают в error handler автоматически. Их нужно перехватывать вручную через каналы или recover внутри горутины.
  • Паника в error handler: Если в самом error handler произойдёт паника — middleware recover её не поймает (он уже отработал). Пишите error handler максимально оборонительно.

Частые вопросы на собеседовании

  • В каких backend-проектах Fiber (Go framework) является сильным выбором, а где лучше выбрать более простой или другой стек?
  • Как понять, что проблема в сервисе связана с Fiber (Go framework), а не с базой, сетью, инфраструктурой или бизнес-логикой?
  • Проект на Fiber (Go framework) вырос из MVP в большой production-сервис. Какие проблемы архитектуры и сопровождения вы ожидаете увидеть?
  • Представьте, endpoint на Fiber (Go framework) иногда отвечает за секунды вместо миллисекунд. Как вы будете искать причину?

Типичные ошибки

  • Давать ответ про обработка ошибок в Fiber только на уровне определения, не показывая поведение в реальном приложении.
  • Игнорировать границы ответственности вокруг темы «обработка ошибок в Fiber»: кто отменяет работу, кто владеет ресурсом и где формируется ответ клиенту.
  • Не связывать обработка ошибок в Fiber с observability, тестированием или безопасностью, когда это влияет на продакшен-поведение.

Что проверяет интервьюер

  • Точно объясняет, что именно делает обработка ошибок в Fiber и где это используется в Go-коде.
  • Связывает обработка ошибок в Fiber с корректным lifecycle запроса, отменой, конкурентностью или конфигурацией сервера там, где это уместно.
  • Не изобретает API и опирается на реальные контракты официальной документации.

Как вы знаете этот вопрос?

Проверить себя по теме Fiber →

Источники

  • https://docs.gofiber.io/guide/error-handling
  • https://docs.gofiber.io/blog/fiber-v3-error-handling-production
←Предыдущий вопросЧто такое `fiber.Ctx` и какие операции он предоставляет?Следующий вопрос→Как разбирать и привязывать тела запросов в Fiber?

Связанные темы

Fibererror-handlingframework-basicsobservability