РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1373 of 1593 menu

Ошибка context.Canceled

Ошибка context.Canceled представляет собой предопределенную переменную ошибки, которая возвращается функцией Context.Err при вызове на отмененном контексте. Эта ошибка сигнализирует о том, что контекст был отменен до завершения операции, которая с ним связана. Обычно она возникает в длительных операциях, поддерживающих отмену через контекст, таких как HTTP-запросы, обработка данных или работа с базами данных.

Основная причина возникновения ошибки context.Canceled - явный вызов функции отмены, возвращенной context.WithCancel или аналогичными функциями, либо истечение таймаута при использовании context.WithTimeout или context.WithDeadline. При получении этой ошибки следует корректно завершить выполнение текущей операции и освободить ресурсы.

Синтаксис

var Canceled = errors.New("context canceled")

Ошибка context.Canceled является глобальной переменной пакета context и может использоваться для сравнения с ошибкой, возвращаемой методом Err отмененного контекста.

Пример

Создадим контекст с отменой, вызовем функцию отмены и проверим ошибку:

package main import ( "context" "fmt" ) func main() { ctx, cancel := context.WithCancel(context.Background()) cancel() // Отменяем контекст err := ctx.Err() if err == context.Canceled { fmt.Println("Контекст был отменен") } }

Результат выполнения кода:

"Контекст был отменен"

Пример

Используем context.WithTimeout и дождемся истечения таймаута:

package main import ( "context" "fmt" "time" ) func main() { ctx, cancel := context.WithTimeout(context.Background(), 10*time.Millisecond) defer cancel() time.Sleep(20 * time.Millisecond) err := ctx.Err() if err == context.Canceled { fmt.Println("Контекст был отменен") } else { fmt.Printf("Ошибка: %v", err) } }

Результат выполнения кода:

"Контекст был отменен"

Пример

Обработка ошибки context.Canceled при выполнении длительной операции:

package main import ( "context" "fmt" "time" ) func longOperation(ctx context.Context) error { select { case <-time.After(2 * time.Second): return fmt.Errorf("операция завершена") case <-ctx.Done(): return ctx.Err() } } func main() { ctx, cancel := context.WithCancel(context.Background()) go func() { time.Sleep(100 * time.Millisecond) cancel() }() err := longOperation(ctx) if err == context.Canceled { fmt.Println("Операция прервана из-за отмены контекста") } else if err != nil { fmt.Printf("Ошибка: %v", err) } }

Результат выполнения кода:

"Операция прервана из-за отмены контекста"

Смотрите также

  • функцию Context.Err,
    которая возвращает ошибку отмены контекста
  • функцию context.WithCancel,
    которая создает контекст с возможностью отмены
  • функцию context.WithTimeout,
    которая создает контекст с таймаутом
  • функцию Context.Done,
    которая возвращает канал для ожидания отмены контекста
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить