Материал проходит вычитку — возможны неточности.
Урок 109 из 118

Err, Background, TODO

В логах инцидента смешались два сценария: «клиент ушёл» и «мы не успели». Миша добавил в обработку ошибок причину отмены из ctx.Err, и графики разъехались на две разные кривые.

Главная мысль

Err сообщает причину отмены — Canceled или DeadlineExceeded; Background — корень всех контекстов, а TODO — заглушка «решу позже».

Причина отмены

Go

Err возвращает nil, пока контекст жив, и причину — после отмены. Различать Canceled и DeadlineExceeded важно: «клиент ушёл» и «мы не успели» — разные сценарии, разные метрики, разная реакция.

Background — корень

ctx := context.Background()

Background — пустой, никогда не отменяемый контекст. Это корень дерева: от него заводят все остальные. Он для верхнего уровня — main, инициализации, тестов.

TODO — честная заглушка

ctx := context.TODO()

TODO — тот же пустой контекст, но с другим смыслом: «здесь должен быть настоящий контекст, но пока не решил, какой». Отличие чисто человеческое: TODO в коде — маркер для будущего рефакторинга, Background — осознанный выбор «отмены не будет». Оба не отменяются никогда.

В следующем уроке

Вы узнаете:

  • как проверять Err() в select вместо Done()
  • как логировать причину отмены в метриках
Задание · вопросы

Проверьте себя

Вопрос 1 из 2

Чем context.Canceled отличается от context.DeadlineExceeded?

Вопрос 2 из 2

Чем context.Background отличается от context.TODO?

Итоги

Err() — причина отмены: Canceled или DeadlineExceeded. Background — корень дерева, TODO — временная заглушка; оба никогда не отменяются.

Наш сайт собирает куки. Чтобы тебе было удобнее им пользоваться. Нажимая на кнопку, ты даёшь разрешение собирать куки