INTEGRITY Документация

Ошибки

Классы и коды ошибок, возвращаемые Sandbox SDK 1.0 preview, с краткими рекомендуемыми действиями. Полные процедуры восстановления см. в Ошибки и восстановление.

Как возвращаются ошибки

Операции выбрасывают исключения, которые можно перехватить. Предпочтительнее используйте instanceof для классов из @cloudflare/sandbox. Используйте code и context для метрик и стабильного доступа к полям.

import {
	ContainerUnavailableError,
	OperationInterruptedError,
	RPCTransportError,
} from "@cloudflare/sandbox";

try {
	await sandbox.exec(["npm", "test"], { cwd: "/workspace/app" });
} catch (error) {
	if (error instanceof ContainerUnavailableError) {
		// error.code === "CONTAINER_UNAVAILABLE"
		// error.context.reason, error.context.retryAfterMs
	}
	if (error instanceof OperationInterruptedError) {
		// Convenience getters: error.reason, error.retryable, error.operationName
		// admitted is only on context: error.context.admitted
	}
	if (error instanceof RPCTransportError) {
		// Convenience getters: error.kind, error.originalMessage
	}
}
import {
	ContainerUnavailableError,
	OperationInterruptedError,
	RPCTransportError,
} from "@cloudflare/sandbox";

try {
	await sandbox.exec(["npm", "test"], { cwd: "/workspace/app" });
} catch (error) {
	if (error instanceof ContainerUnavailableError) {
		// error.code === "CONTAINER_UNAVAILABLE"
		// error.context.reason, error.context.retryAfterMs
	}
	if (error instanceof OperationInterruptedError) {
		// Convenience getters: error.reason, error.retryable, error.operationName
		// admitted is only on context: error.context.admitted
	}
	if (error instanceof RPCTransportError) {
		// Convenience getters: error.kind, error.originalMessage
	}
}

Импорты

Частые ошибки жизненного цикла, процессов, терминала и резервного копирования доступны из корня пакета:

import {
	ContainerUnavailableError,
	OperationInterruptedError,
	RPCTransportError,
	StaleProcessHandleError,
	// ...
} from "@cloudflare/sandbox";
import {
	ContainerUnavailableError,
	OperationInterruptedError,
	RPCTransportError,
	StaleProcessHandleError,
	// ...
} from "@cloudflare/sandbox";

Полный модуль также экспортирует ErrorCode, SandboxError, createErrorFromResponse, и другие ошибки предметной области (файлы, порты, интерпретатор, точки монтирования и связанные типы контекста):

import {
	ErrorCode,
	SandboxError,
	createErrorFromResponse,
	FileNotFoundError,
	// ...
} from "@cloudflare/sandbox/errors";
import {
	ErrorCode,
	SandboxError,
	createErrorFromResponse,
	FileNotFoundError,
	// ...
} from "@cloudflare/sandbox/errors";

Вспомогательные функции платформы (не SandboxError подклассы):

import {
	isPlatformTransientError,
	isDurableObjectCodeUpdateReset,
} from "@cloudflare/sandbox";
import {
	isPlatformTransientError,
	isDurableObjectCodeUpdateReset,
} from "@cloudflare/sandbox";

SandboxError форму

Большинство ошибок SDK наследуются от SandboxError:

Участник Описание
name Имя класса (например ContainerUnavailableError)
message Человекочитаемое сообщение
code Стабильный ErrorCode строка (например, CONTAINER_UNAVAILABLE)
context Структурированные поля для типа ошибки
httpStatus Сопоставленный HTTP-статус, если применимо
operation Метка операции, если указана
suggestion Необязательная рекомендация к действию
timestamp Метка времени ISO, если указана
toJSON() Сериализует поля ошибки для логов

RuntimeIdentityInactiveError расширяет Error напрямую (а не SandboxError). Это означает, что текущий контейнер больше не является активным для этого handle или вызова.

Таблицы включают Рекомендуемое исправление столбце. Подробные процедуры восстановления см. Ошибки и восстановление.

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


Доступность контейнера и прерванные вызовы

Эти ошибки возникают из-за обычного запуска, остановки при простое, замены или потери связи во время выполнения вызова.

Класс Код Ключевой контекст Подробности Рекомендуемое исправление
ContainerUnavailableError CONTAINER_UNAVAILABLE reason, retryable: true, retryAfterMs? Контейнер не был готов до начала операции. Сделайте паузу (учитывайте retryAfterMs если она установлена), затем повторите такую же операцию.
OperationInterruptedError OPERATION_INTERRUPTED reason, operation, admitted, retryable Контейнер или песочница изменились уже после того, как операция могла начаться. Прочитайте reason и retryable. Перед повторным выполнением операции, изменяющей состояние, проверьте состояние песочницы или приложения.
RPCTransportError RPC_TRANSPORT_ERROR kind, originalMessage, errorName, closeCode? SDK потерял связь с контейнером во время вызова. Более поздний вызов может сработать. Этот вызов, возможно, уже что-то изменил.
RuntimeIdentityInactiveError , , Текущий контейнер больше не активен для этого вызова или дескриптора. Обычные Error, а не SandboxError. Проверьте, существует ли ресурс. Если нет, начните работу заново из сохранённого состояния.

ContainerUnavailableError причины

context.reason:

Причина Значение
container_starting Контейнер ещё запускается
container_unhealthy Контейнер неисправен
container_replaced Контейнер был заменён
rpc_upgrade_failed Не удалось установить связь с контейнером

OperationInterruptedError причины

reason / context.reason:

Причина Значение
runtime_replaced Базовый экземпляр контейнера был заменён
container_stopped Контейнер остановлен
transport_disposed Сеанс связи закрыт
sandbox_destroyed Песочница была уничтожена
sandbox_lifetime_changed Изменена конфигурация времени жизни песочницы
recovery_exhausted Попытки восстановления исчерпаны
unknown Неклассифицированное прерывание

Удобные геттеры у ошибки: reason, retryable, а также operationName. Другие поля, такие как admitted, operationId, phase, и метаданные, связанные с резервным копированием, находятся на error.context только (admitted это true | "unknown").

RPCTransportError видов

kind / context.kind:

Тип Значение
peer_closed Удалённая сторона закрыла соединение
connection_failed Не удалось подключиться
upgrade_failed Не удалось установить соединение
invalid_frame Неожиданный фрейм
protocol_error Кадр отклонён протоколом
session_disposed Сессия завершена
unknown Неклассифицированный сбой

Несоответствие Worker и образа контейнера

Такие сбои обычно означают, что пакет Worker и образ контейнера не соответствуют друг другу, образ не может запуститься или метаданные настройки не совпадают с тем, что ожидает SDK. Исправьте развёртывание. Не воспринимайте это как медленный запуск контейнера.

Разверните пакет Worker и образ контейнера песочницы из одной и той же @cloudflare/sandbox@next строка. Именно здесь часто возникает сбой, если preview Worker использует стабильный образ (или наоборот).

Класс Код Ключевой контекст Подробности Рекомендуемое исправление
RuntimeControlProtocolError INTERNAL_ERROR reason Worker и контейнер не смогли совместно завершить настройку (несоответствие метаданных или протокола). Этот код является общим INTERNAL_ERROR значение: определите этот класс с помощью instanceof RuntimeControlProtocolError или через сочетание code === "INTERNAL_ERROR" с context.reason. Разверните пакет Worker и образ контейнера из одной линии релизов. При необходимости исправьте конфигурацию.

RuntimeControlProtocolError причины

context.reason:

Причина Значение Примечания
unsupported-protocol-version Версии протокола Worker и контейнера не совпадают Пакет Worker и образ контейнера относятся к разным релизам
missing-metadata В контейнере отсутствуют обязательные метаданные настройки Некорректный или неполный образ либо сборка
malformed-metadata Не удалось разобрать метаданные настройки Некорректный или неполный образ либо сборка
activation-mismatch Активация не соответствует ожидаемому контейнеру Может появляться после замены контейнера: если это повторяется, проверьте соответствие Worker и образа

Следующие постоянные проблемы связаны между собой и возвращают одинаковый ответ:

Проблема Рекомендуемое исправление
Неверный или отсутствующий образ контейнера в wrangler / registry Разверните пакет Worker и образ контейнера из одной линии релизов. При необходимости исправьте конфигурацию.
Контейнер завершает работу раньше, чем становится готовым Исправьте образ или entrypoint и выполните повторный деплой. Не ограничивайтесь повтором вызова приложения.
Ограничения ёмкости аккаунта или региона См. Ограничения ёмкости в продакшене

Процесс

Класс Код Ключевой контекст Подробности Рекомендуемое исправление
ProcessNotFoundError PROCESS_NOT_FOUND processId Неизвестный идентификатор процесса в текущем контейнере. Используйте правильный ID или запустите процесс заново из сохранённого состояния.
StaleProcessHandleError STALE_PROCESS_HANDLE processId, pid, operation Дескриптор или ID от предыдущего контейнера. Запустите работу заново из сохранённого состояния. Не используйте повторно старый handle.
ProcessSpawnFailedError PROCESS_SPAWN_FAILED processId, command, cwd?, stderr? Не удалось запустить процесс. Исправьте путь, окружение, команду или другие аргументы. Не повторяйте тот же недопустимый запрос.
InvalidProcessCwdError INVALID_PROCESS_CWD cwd, reason Недопустимый рабочий каталог. Исправьте путь, окружение, команду или другие аргументы. Не повторяйте тот же недопустимый запрос.
InvalidProcessEnvironmentError INVALID_PROCESS_ENVIRONMENT name?, reason Недопустимый оверлей окружения. Исправьте путь, окружение, команду или другие аргументы. Не повторяйте тот же недопустимый запрос.
InvalidProcessCursorError INVALID_PROCESS_CURSOR processId, cursor?, reason Некорректный курсор журнала. Исправьте курсор или другие аргументы. Не повторяйте попытку с тем же недопустимым значением.
ProcessWaitTimeoutError PROCESS_WAIT_TIMEOUT processId, operation, timeout Локальный output, waitForExit, или waitForLog истекло время ожидания. Ожидание завершилось. Процесс или терминал может всё ещё выполняться.
ProcessAbortedError PROCESS_ABORTED processId, operation Локальный AbortSignal завершил ожидание или поток. Ожидание завершилось. Процесс или терминал может всё ещё выполняться.
ProcessReadyTimeoutError PROCESS_READY_TIMEOUT processId, command, condition, timeout Истекло время ожидания готовности. Проверяйте, выполняется ли процесс, прежде чем запускать другой.
ProcessExitedBeforeReadyError PROCESS_EXITED_BEFORE_READY processId, command, condition, exitCode Процесс завершился до готовности. Исправьте команду или окружение, затем при необходимости запустите снова.
ProcessExitedBeforeLogError PROCESS_EXITED_BEFORE_LOG processId, pid, exit Процесс завершился до появления совпадения в логе. Исправьте команду или окружение, затем при необходимости запустите снова.
ProcessError PROCESS_ERROR processId, pid?, exitCode?, stderr? Общий сбой процесса. Проверяйте состояние песочницы или приложения, прежде чем повторять действия, которые изменяют состояние.

getProcess и listProcesses возвращая null или [] не является ошибкой.


Терминал

Класс Код Ключевой контекст Подробности Рекомендуемое исправление
TerminalNotFoundError TERMINAL_NOT_FOUND terminalId Неизвестный идентификатор терминала в текущем контейнере. Используйте правильный ID или запустите терминал заново из сохранённого состояния.
StaleTerminalHandleError STALE_TERMINAL_HANDLE terminalId, operation Дескриптор или ID от предыдущего контейнера. Запустите работу заново из сохранённого состояния. Не используйте повторно старый handle.
InvalidTerminalCwdError INVALID_TERMINAL_CWD terminalId, cwd, reason Недопустимый рабочий каталог при создании. Исправьте путь, окружение, команду или другие аргументы. Не повторяйте тот же недопустимый запрос.
InvalidTerminalCursorError INVALID_TERMINAL_CURSOR terminalId, cursor?, reason Некорректный курсор вывода. Исправьте курсор или другие аргументы. Не повторяйте попытку с тем же недопустимым значением.
TerminalControlError TERMINAL_CONTROL_ERROR terminalId, operation, reason? Не удалось выполнить прерывание, завершение, изменение размера или другую операцию управления. Проверяйте состояние песочницы или приложения, прежде чем повторять действия, которые изменяют состояние.

getTerminal и listTerminals возвращая null или [] не является ошибкой.


Резервная копия

Класс Код Подробности Рекомендуемое исправление
BackupCreateError BACKUP_CREATE_FAILED Не удалось создать резервную копию. Проверьте детали сбоя. Исправьте параметры, если они недействительны.
BackupRestoreError BACKUP_RESTORE_FAILED Не удалось восстановить резервную копию. Проверьте детали сбоя. Исправьте параметры, если они недействительны.
BackupNotFoundError BACKUP_NOT_FOUND Неизвестный идентификатор резервной копии. Исправьте путь, окружение, команду или другие аргументы. Не повторяйте тот же недопустимый запрос.
BackupExpiredError BACKUP_EXPIRED Срок действия резервной копии истёк. Исправьте параметры или создайте новую резервную копию.
InvalidBackupConfigError INVALID_BACKUP_CONFIG Недопустимые параметры резервного копирования. Исправьте путь, окружение, команду или другие аргументы. Не повторяйте тот же недопустимый запрос.

Другие домены

Эти классы доступны из @cloudflare/sandbox/errors (а также некоторых вспомогательных инструментов монтирования из корня пакета). Уточняйте детали по фактически установленному у вас пакету. Руководства по preview пока опубликованы не для всех доменов.

Домен Примеры Рекомендуемое исправление
Файловая система FileNotFoundError, FileExistsError, PermissionDeniedError, FileTooLargeError, FileSystemError Исправьте путь или обработайте отсутствующий файл.
Порты / предпросмотр PortAlreadyExposedError, PortNotExposedError, InvalidPortError, PortInUseError, ServiceNotRespondingError, CustomDomainRequiredError Исправьте настройки портов или EXPOSE.
Interpreter (расширение) InterpreterNotReadyError, ContextNotFoundError, CodeExecutionError Если интерпретатор не готов, подождите и повторите попытку. В противном случае исправьте запрос.
Подключения BucketMountError, BucketUnmountError, S3FSMountError, MissingCredentialsError, InvalidMountConfigError Исправьте параметры монтирования или учётные данные.
Проверка ValidationFailedError Исправьте путь, окружение, команду или другие аргументы. Не повторяйте тот же недопустимый запрос.

Другие классы доменов могут существовать в @cloudflare/sandbox/errors в установленном у вас пакете. Прежде чем полагаться на недокументированные возможности, сверьтесь с этим пакетом.

Ошибки, связанные с подключением, также экспортируются из @cloudflare/sandbox рядом с API монтирования.


Вспомогательные функции платформы

Вспомогательная функция Подробности Рекомендуемое исправление
isPlatformTransientError(error) True для некоторых временных сигналов платформы (например, потеря соединения, отдельные сбросы хранилища Durable Object при запуске или ошибки платформы, допускающие повтор). Предпочитайте новый запрос или операцию.
isDurableObjectCodeUpdateReset(error) True, если изолят Durable Object был заменён в результате обновления кода или развёртывания. Не повторяйте попытки в рамках одного запроса. Позвольте новому запросу выполниться на новом isolate.

Эти вспомогательные функции дополняют SandboxError подклассы. Они не заменяют правила восстановления для Ошибки и восстановление.


Ограничения ёмкости в продакшене

В продакшене платформа Containers может отклонять задачи при превышении лимитов аккаунта или деплоя (например SURPASSED_BASE_LIMITS, SURPASSED_TOTAL_LIMITS, LOCATION_SURPASSED_BASE_LIMITS). Повторный запуск той же перегруженной операции проблему не решит. Снизьте параллелизм, увеличьте лимиты или предусмотрите запасной путь с участием оператора. Обычно эти лимиты не проявляются при локальной wrangler dev.

См. Лимиты платформы.