Ядро
Result, ошибки и логирование
Рабочая справка по Result, ошибкам и логированию в Bitrix Framework: isSuccess, getErrorMessages, Debug::dumpToFile, AddMessage2Log и try-catch.
Многие D7-методы возвращают объект результата. Его не нужно проверять через
empty(): сначала смотрим isSuccess(), потом читаем ошибки через
getErrorMessages() или getErrors().
Result
Bitrix\Main\Result — стандартный способ вернуть успех или список ошибок.
isSuccess
<?php
use Bitrix\Main\Result;
/**
* Проверяет результат операции.
*/
function handleOperationResult(Result $result): array
{
return [
'is_success' => $result->isSuccess(),
'error_messages' => $result->getErrorMessages(),
];
} getErrorMessages
Для вывода пользователю или записи в лог обычно удобнее брать уже готовые строки ошибок.
<?php
/**
* Возвращает текст ошибок через перенос строки.
*/
function buildErrorText(\Bitrix\Main\Result $result): string
{
return implode(PHP_EOL, $result->getErrorMessages());
} Свой Result
<?php
use Bitrix\Main\Error;
use Bitrix\Main\Result;
/**
* Проверяет входной ID и возвращает Result.
*/
function validateEntityId(int $entity_id): Result
{
$result = new Result();
if ($entity_id <= 0) {
$result->addError(
new Error('ID сущности не заполнен')
);
}
return $result;
}
$result = validateEntityId($entity_id);
if (!$result->isSuccess()) {
print_r($result->getErrorMessages());
} Ошибки
Для служебных скриптов лучше оборачивать основной код в try-catch.
try-catch
<?php
use Bitrix\Main\Diag\Debug;
/**
* Пишет исключение в лог.
*/
function writeExceptionLog(\Throwable $exception): void
{
Debug::dumpToFile(
[
'message' => $exception->getMessage(),
'file' => $exception->getFile(),
'line' => $exception->getLine(),
'trace' => $exception->getTraceAsString(),
],
'exception',
'/local/logs/exceptions.log'
);
}
try {
// Основной код
} catch (\Throwable $exception) {
writeExceptionLog($exception);
} Error и ErrorCollection
Если нужно не просто текстовое сообщение, а код ошибки, можно использовать
Bitrix\Main\Error.
<?php
use Bitrix\Main\Error;
use Bitrix\Main\Result;
/**
* Возвращает ошибку с кодом.
*/
function buildFailedResult(string $message, string $code): Result
{
$result = new Result();
$result->addError(
new Error($message, $code)
);
return $result;
}
$result = buildFailedResult('Недостаточно данных', 'EMPTY_REQUIRED_FIELDS');
print_r($result->getErrors()); Логирование
Для AJAX, cron, агентов и обработчиков событий удобнее писать в файл, а не выводить на экран.
Debug::dumpToFile
<?php
use Bitrix\Main\Diag\Debug;
/**
* Пишет данные в debug-файл.
*/
function writeDebugData($data, string $label): void
{
Debug::dumpToFile(
$data,
$label,
'/local/logs/debug.log'
);
}
writeDebugData(
[
'deal_id' => 123,
'status' => 'start',
],
'crm_debug'
); AddMessage2Log
AddMessage2Log() часто встречается в старом коде и быстрых проверках.
<?php
/**
* Пишет сообщение в лог старым способом.
*/
function writeOldBitrixLog(string $message, array $context = []): void
{
AddMessage2Log(
[
'message' => $message,
'context' => $context,
],
'custom_debug'
);
}
writeOldBitrixLog('Проверка обработчика', ['deal_id' => 123]); Единая функция лога
<?php
use Bitrix\Main\Diag\Debug;
const LOG_FILE = '/local/logs/custom.log';
/**
* Пишет сообщение в единый лог.
*/
function writeLogMessage(string $message, array $context = []): void
{
Debug::dumpToFile(
[
'date' => date('Y-m-d H:i:s'),
'message' => $message,
'context' => $context,
],
'log',
LOG_FILE
);
}
writeLogMessage('Скрипт запущен', ['user_id' => 1]);