Обработка ошибок¶
Все ошибки RAC разбираются в типизированные исключения из raclib.errors.
Ловить текст из stderr не нужно — исключение уже содержит готовое описание.
import raclib as rc
from raclib import errors
session = rc.Session(rc.Client("/opt/1cv8/x86_64/8.3.24.1548/rac"), timeout=30)
try:
rc.Cluster.info(session, "unknown-cluster-id")
except errors.ClusterNotFoundError:
print("Кластер не найден")
except errors.RACTimeoutError:
print("Сервер администрирования не ответил за отведённое время")
except errors.RACNotFoundError:
print("Не найден или не запускается исполняемый файл rac")
except errors.UnknownError as exc:
print("Незнакомая ошибка RAC:", exc)
Какие исключения бывают¶
Проблемы с запуском rac¶
Бросаются до запуска команды или вместо её результата.
| Исключение | Когда |
|---|---|
RACNotFoundError |
файл rac не найден, не исполняем или путь указывает на каталог |
RACTimeoutError |
rac не ответил за timeout секунд, заданный в сессии |
RACNotFoundError наследуется от FileNotFoundError, RACTimeoutError — от
TimeoutError, поэтому оба можно поймать стандартными исключениями Python.
Ошибки аутентификации¶
| Исключение | Что проверить |
|---|---|
ClusterCredentialsError |
cluster_user / cluster_pwd |
AgentCredentialsError |
agent_user / agent_pwd |
CentralServerCredentialsError |
права администратора центрального сервера |
InfobaseCredentialsError |
infobase_user / infobase_pwd |
Объект не найден¶
ClusterNotFoundError, InfobaseNotFoundError, CounterNotFoundError,
LimitNotFoundError, RuleNotFoundError — обычно означают опечатку в
идентификаторе или попытку работать с объектом из другого кластера.
Конфликты и ограничения сервера¶
| Исключение | Причина |
|---|---|
ServerIsMainError |
попытка удалить центральный сервер кластера |
ServerAlreadyExistsError |
такой рабочий сервер уже зарегистрирован |
InfobaseAlreadyExistsError |
база уже зарегистрирована в кластере |
ServerIPRangeError |
левая граница диапазона IP-портов больше правой |
PortConflictError |
конфликт IP-портов при запуске рабочего процесса |
AgentAdminCreateError |
попытка удалить последнего администратора с паролем |
UnknownHostError |
компьютер отсутствует в сети или недоступен |
Проблемы с базой данных¶
| Исключение | Что делать |
|---|---|
InfobaseDatabaseNotFoundError |
передать create_database=True в Infobase.create |
CreateInfobaseParamsError |
проверить dbms, db_server, db_name, db_user, db_pwd |
DatabaseConnectionError |
сервер баз данных не обнаружен — проверить доступность |
DatabaseError |
операция с базой не выполнена, подробности в тексте исключения |
Прочее¶
| Исключение | Причина |
|---|---|
IncorrectVersionError |
версии rac и сервера 1С различаются |
ParamError |
RAC не принял параметр команды |
ConnectionError |
не удалось соединиться с сервером администрирования |
UnknownError |
ошибка, которой нет в таблице соответствий |
UnknownError¶
Таблица соответствий покрывает типовые сообщения RAC, но она построена на
локализованном тексте и не может быть исчерпывающей: новая версия 1С или
англоязычная локаль сервера дадут незнакомую формулировку. В этом случае
поднимается UnknownError, который сохраняет исходный текст RAC:
try:
rc.Counter.update(session, cluster, name="cpu", collection_time="0", group="process", filter_type="processor")
except errors.UnknownError as exc:
print(exc) # строки, которые вернул RAC
print(exc.stderr) # исходный stderr целиком
Если вы получили UnknownError на штатной ситуации — это повод добавить шаблон
в таблицу raclib.errors.errors.
Общий обработчик¶
Для скриптов удобно один раз преобразовать всё в понятный вывод:
import sys
import raclib as rc
from raclib import errors
session = rc.Session(rc.Client(RAC), timeout=30)
try:
rc.Cluster.remove(session, cluster_id, cluster_user="admin", cluster_pwd="secret")
except errors.ClusterCredentialsError:
sys.exit("Неверные учётные данные администратора кластера")
except errors.ClusterNotFoundError:
sys.exit("Кластер не найден")
except (errors.RACNotFoundError, errors.RACTimeoutError) as exc:
sys.exit(f"RAC недоступен: {exc}")
except errors.UnknownError as exc:
sys.exit(f"Ошибка RAC: {exc}")