Tarantool CE/EE Documentation portal logo
Помощь
Обновлена 15 сентября 2026 г. в 08:55

Коды ошибок базы данных

В таблице ниже перечислены некоторые распространенные ошибки, которые могут возникать в Tarantool при различных проблемах. Полный список ошибок доступен в файле errcode.h.

Код

Значение box.error

Описание

ER_NONMASTER

box.error.NONMASTER

(При репликации) Экземпляр сервера не может изменять данные, если он не является мастером.

ER_ILLEGAL_PARAMS

box.error.ILLEGAL_PARAMS

Недопустимые параметры. Некорректное сообщение протокола.

ER_MEMORY_ISSUE

box.error.MEMORY_ISSUE

Нехватка памяти: достигнут предел memtx_memory.

ER_WAL_IO

box.error.WAL_IO

Ошибка записи на диск. Может означать: не удалось записать изменение в журнал предзаписи.

ER_READONLY

box.error.READONLY

Невозможно изменить данные на экземпляре, доступном только для чтения.

ER_KEY_PART_COUNT

box.error.KEY_PART_COUNT

Количество частей ключа не совпадает с количеством частей индекса.

ER_NO_SUCH_SPACE

box.error.NO_SUCH_SPACE

Указанный спейс не существует.

ER_NO_SUCH_INDEX

box.error.NO_SUCH_INDEX

Указанный индекс в указанном спейсе не существует.

ER_PROC_LUA

box.error.PROC_LUA

Произошла ошибка внутри Lua-процедуры.

ER_FIBER_STACK

box.error.FIBER_STACK

Достигнут предел рекурсии при создании нового файбера. Обычно это означает, что хранимая процедура рекурсивно вызывает сама себя слишком часто.

ER_UPDATE_FIELD

box.error.UPDATE_FIELD

Произошла ошибка при обновлении поля.

ER_TUPLE_FOUND

box.error.TUPLE_FOUND

В уникальном индексе обнаружен дубликат ключа.

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

Ниже представлены несколько процедур для более надежного вызова Lua-функций в случае ошибок, в частности, ошибок базы данных.

  1. Вызов функции с помощью pcall.

    Используйте механизмы Lua для обработки ошибок и исключений, в частности pcall. То есть, вместо вызова ...

    box.space.{space-name}:{function-name}()

    ... вызывайте функцию следующим образом:

    if pcall(box.space.{space-name}.{function-name}, box.space.{space-name}) ...

    Для некоторых функций box в Tarantool pcall также возвращает детали ошибки, включая имя файла и номер строки в исходном коде Tarantool. Это можно увидеть, распаковав результат, например:

    status, error = pcall(function() box.schema.space.create('') end)error:unpack()

    См. руководство Суммирование JSON-поля для всех кортежей, чтобы узнать, как pcall можно использовать в приложении.

  2. Анализ ошибок и вызов новых ошибок с помощью box.error.

    Для создания новой ошибки и её передачи модуль box.error предоставляет box.error().

    Для получения последней ошибки подмодуль box.error предоставляет box.error.last(). Также существует способ получить текст последней ошибки операционной системы для определённых функций — errno.strerror([code]).

  3. Журналирование. Записывайте сообщения в журнал с помощью модуля log.

Фильтрация автоматически генерируемых сообщений выполняется с помощью конфигурационного параметра log.

Как правило, для встроенных функций Tarantool, предназначенных для возврата объектов: результатом является объект, nil или ошибка Lua. Например, рассмотрим программу fio_read.lua из руководства:

#!/usr/bin/env tarantoollocal fio = require('fio')local errno = require('errno')local f = fio.open('/tmp/xxxx.txt', {'O_RDONLY' })if not f then    error("Failed to open file: "..errno.strerror())endlocal data = f:read(4096)f:close()print(data)

После вызова функции, который может завершиться неудачей, как в случае с fio.open() выше, часто встречается конструкция вида if not f then ... или if f == nil then ..., проверяющая типичные ошибки. Но если бы была допущена синтаксическая ошибка, например fio.opex вместо fio.open, то возникла бы ошибка Lua, и значение f не изменилось бы. Если бы проверка таких очевидных ошибок имела значение, программист, вероятно, использовал бы pcall().

Все функции в модулях Tarantool должны работать таким образом, если в руководстве явно не говорится об обратном.