← Sandbox SDK / sandbox / 1-0-preview / api
Ошибки
Классы и коды ошибок, возвращаемые 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.
См. Лимиты платформы.