Обработка ошибок в Битрикс
При разработке под Битрикс можно пользоваться не только логами, установленными в конфигурации сервера, но и своими. Для этого нужно настроить обработчик ошибок в секции exception_handling в файле /bitrix/.settings.php.
'exception_handling' =>
array (
'value' =>
array (
'handled_errors_types' => E_ALL & ~E_NOTICE & ~E_STRICT & ~E_USER_NOTICE & ~E_DEPRECATED,
'exception_errors_types' => E_ALL & ~E_NOTICE & ~E_WARNING & ~E_STRICT & ~E_USER_WARNING & ~E_USER_NOTICE & ~E_COMPILE_WARNING,
'ignore_silence' => true,
'assertion_throws_exception' => false,
'assertion_error_type' => 256,
'debug' => true,
'log' => array (
'settings' => array (
'file' => 'bitrix/modules/error.log',
'log_size' => 1000000,
),
),
),
),
-
handled_errors_types — типы обрабатываемых ошибок
-
exception_errors_types — типы ошибок, в случае которых системой выбрасывается исключение, и работа скрипта останавливается
-
ignore_silence — отменить действие оператора подавления ошибок (значок @ перед функцией, например @file(), документация).
-
assertion_throws_exception — выбрасывают ли утверждения (assert()) исключения.
-
assertion_error_type — тип ошибки для неверного утверждения (по умолчанию — 256 E_USER_ERROR)
-
debug — если выставить debug = true, информация об ошибке будет выведена пользователю в браузер. Если debug = false, при возникновении ошибки будет выведено стандартное сообщение от Битрикс, кроме ошибок E_ERROR | E_PARSE
if ($this->debug)
{
error_reporting($this->handledErrorsTypes);
@ini_set('display_errors', 'On');
@ini_set('display_startup_errors', 'On');
@ini_set('report_memleaks', 'On');
}
else
{
error_reporting(E_ERROR | E_PARSE);
}
При отключении режима отладки, также сбрасываются настройки для assert()
if ($this->debug)
{
assert_options(ASSERT_ACTIVE, 1);
assert_options(ASSERT_WARNING, 0);
assert_options(ASSERT_BAIL, 0);
assert_options(ASSERT_QUIET_EVAL, 0);
assert_options(ASSERT_CALLBACK, array($this, "handleAssertion"));
}
else
{
assert_options(ASSERT_ACTIVE, 0);
}
- log — секция с указанием логгера. Если пусто, то запись ошибок происходить не будет. В данном случае по умолчанию всю работу на себя возьмет объект класса BitrixMainDiagFileExceptionHandlerLog.
- settings — секция с настройками обработчика ошибок. Можно задавать произвольные параметры. Они все передадутся массивом в метод initialize() обработчика.
- file — относительный путь к файлу логов от корневой директории сайта (BitrixMainApplication::getDocumentRoot().’/’.$file).
- log_size — максимальный размер файла логов в байтах.
Можно использовать собственный обработчик ошибок для записи логов. Для этого в секции log нужно указать:
'class_name' => 'MyLog',
'extension' => 'MyLogExt',
'required_file' => 'modules/mylog.module/mylog.php'
- class_name — имя класса-обработчика. Класс должен наследоваться от BitrixMainDiagExceptionHandlerLog. Метод write в 16 версии отличается от реализации в 15 версии, эта несовместимость может сломать сайт, будьте внимательны.
- extension — подключаемое расширение, содержащее класс-обработчик
- required_file — файл, содержащий нужный класс.
Модули АХТУНГ 500 И АХТУНГ 500 ПРО
Модули Ахтунг 500 и Ахтунг 500 ПРО предназачены для мгновенного оповещения об ошибках по e-mail и через браузер, когда администратор находится на сайте.
Мониторинг ошибок происходит не только через обработчик ошибок Битрикса, но и через чтение файлов логов сервера, есть поиск.
Перейти к подробному описанию Ахтунг 500 ПРО
Всем привет.
Продолжаем познавать нововведения нового ядра продукта.
На этот раз — это подключение собственного обработчика ошибок для всего продукта.
За обработку ошибок отвечает блок exception_handling в файле настроек /bitrix/.settings.php
В данном блоке есть параметр log, в котором можно добавить опции:
'class_name' => 'MyTest', 'extension' => '', 'required_file' => 'modules/mylog.module/lib/log.php',
в данном случае, уже указаны мои тестовые значения.
По названию, я думаю, понятно, что за что отвечает.
Двигаем далее. Мы указали подключение файла modules/mylog.module/lib/log.php, его и создадим.
<?php class MyTest extends BitrixMainDiagExceptionHandlerLog { private $URL; public function initialize(array $options) { $this->URL = $options["send_url"]; } public function write(Exception $exception, $logType) { $title = BitrixMainDiagExceptionHandlerFormatter::severityToString($exception->getSeverity()); $text = $exception->getMessage(); $text .= "n".$exception->getFile()."[".$exception->getLine()."]"; $this->SendError($title,$text); } protected function SendError($title,$text) { $data = array('name' => $title, 'text' => $text); $sock = new CHTTP(); $sock->Post($this->URL,$data); } }
Как видно, класс тот, что указан в конфигурационном файле. Данный класс должен быть унаследован от BitrixMainDiagExceptionHandlerLog
Обязательных 2 функции initialize и write.
Собственно первая вызывается для инициализации, а вторая для обработки ошибки.
В функции инициализации у меня просто заполняется переменная, значение для которой передается из .settings.php
В функции записи производится подготовка текста ошибок для отправки.
Затем вызывается SendError, которая отправляет данные мне на компьютер, на специальный скрипт. Как итог, на экране я вижу возникающие ошибки.
bug_report Обработка ошибок
Как перестать беспокоиться и начать программировать? Попробуйте использовать PHPUnit в Битрикс!
Обработка ошибок в Битрикс
При разработке под Битрикс можно пользоваться не только логами, установленными в конфигурации сервера, но и своими. Для этого нужно настроить обработчик ошибок в секции exception_handling в файле /bitrix/.settings.php
:
'exception_handling' => array ( 'value' => array ( 'handled_errors_types' => E_ALL & ~E_NOTICE & ~E_STRICT & ~E_USER_NOTICE & ~E_DEPRECATED, 'exception_errors_types' => E_ALL & ~E_NOTICE & ~E_WARNING & ~E_STRICT & ~E_USER_WARNING & ~E_USER_NOTICE & ~E_COMPILE_WARNING, 'ignore_silence' => true, 'assertion_throws_exception' => false, 'assertion_error_type' => 256, 'debug' => true, 'log' => array ( 'settings' => array ( 'file' => 'bitrix/modules/error.log', 'log_size' => 1000000, ), ), ), ),
Можно использовать собственный обработчик ошибок для записи логов. Для этого в секции log
нужно указать:
'class_name' => 'MyLog', 'extension' => 'MyLogExt', 'required_file' => 'modules/mylog.module/mylog.php'
https://bitrixsolutions.ru/docs/bitrix_errors/ — человек грамотно сделал обработку ошибок, вот что мне понравилось: Logger::SHIT_HAPPENS
, Logger::VOVA_POMOGI
Отправка сообщения об ошибке на почту
При разработке под Битрикс можно пользоваться не только логами, установленными в конфигурации сервера, но и своими. Для этого нужно настроить обработчик ошибок в секции exception_handling в файле /bitrix/.settings.php
'exception_handling' =>
array (
'value' =>
array (
'handled_errors_types' => E_ALL & ~E_NOTICE & ~E_STRICT & ~E_USER_NOTICE & ~E_DEPRECATED,
'exception_errors_types' => E_ALL & ~E_NOTICE & ~E_WARNING & ~E_STRICT & ~E_USER_WARNING & ~E_USER_NOTICE & ~E_COMPILE_WARNING,
'ignore_silence' => true,
'assertion_throws_exception' => false,
'assertion_error_type' => 256,
'debug' => true,
'log' => array (
'settings' => array (
'file' => 'bitrix/error.log',
'log_size' => 10000000,
),
),
),
),
Можно использовать кастумный обработчик ошибок для записи логов. Конфигурируется это так:
'class_name' => 'UserLog',
'extension' => 'UserLogExt',
'required_file' => 'modules/mylog.module/mylog.php'
Также возможна отправка сообщения об ошибке на почту ( https://dev.1c-bitrix.ru/api_help/main/functions/debug/senderror.php ):
SendError(
string text,
string module_id = ""
);
- Главная
- Сниппеты Битрикс d7
Обработка исключений битрикса
Август 19, 2019
Теги:
Отладка, Основное
Обработка исключений, «вброшенных» стандартным классом битрикс «BitrixMainSystemException».
Пример обработки ошибочного преобразования json функцией «BitrixMainWebJson::decode»:
try {
$arRes = BitrixMainWebJson::decode($result);
} catch (BitrixMainSystemException $e) {
$error = true; //$e->getMessage();
}
Пример самостоятельного «вбрасывания» исключения:
try {
throw new BitrixMainSystemException("Error");
} catch (BitrixMainSystemException $e) {
$error = true; //$e->getMessage();
}
← Переход к списку
Главная
G-Web IT
Адрес:
Летная улица, 30, корпус 1
141021
Мытищи,
Телефон:+7 985 513–06–60,
Электронная почта: info@goldwebit.net
По будням с 10:00 до 20
Битрикс файл bitrix/.settings.php
Секция exception_handling
Отвечает за обработку ошибок.
'exception_handling' => array (
'value' => array (
'debug' => false,
'handled_errors_types' => E_ALL & ~E_NOTICE &
~E_STRICT & ~E_USER_NOTICE,
'exception_errors_types' => E_ALL & ~E_NOTICE &
~E_WARNING & ~E_STRICT & ~E_USER_WARNING &
~E_USER_NOTICE & ~E_COMPILE_WARNING & ~E_DEPRECATED,
'ignore_silence' => false,
'assertion_throws_exception' => true,
'assertion_error_type' => 256,
'log' => array (
'settings' => array (
'file' => 'bitrix/modules/error.log',
'log_size' => 1000000,
),
),
),
'readonly' => false,
),
Параметр | Значение |
debug | Ключ отвечает за то, будет ли выведена ошибка на страницу в браузере. Выводить ошибки рекомендуется только на время разработки или отладки. Иначе потенциально может быть разглашение информации. |
handled_errors_types | В ключе задаются типы ошибок, которые система отлавливает (не игнорирует). |
exception_errors_types | В ключе задаются типы ошибок, при которых система выбрасывает исключение. |
ignore_silence | Ключ отменяет действие оператора управления ошибками (@). |
log | В ключе задаются параметры логирования ошибок. Если ключа нет — логирования не будет. Если задать как показано в примере: 'log' => array ( 'settings' => array ( 'file' => 'bitrix/modules/error.log', 'log_size' => 1000000, ), ), то логироваться будет в файл с ограничением его размера. Если в корне сайта лежит файл error.php и выключен вывод ошибок на экран, то этот файл будет подключен в случае возникновения необработанного исключения. Если задать в общем случае, то можно логгировать куда угодно: 'log' => array( 'class_name' => 'MyLog', 'extension' => 'MyLogExt', 'required_file' => 'modules/mylog.module/mylog.php' 'settings' => array( ), ), |
assertion_throws_exception |
Включение поддержки команды assert .
|
assertion_error_type |
В ключе задаются типы ошибок, для которых не верный assert выбрасывает исключение.
|
В handled_errors_types, exception_errors_types, assertion_error_type необходимо передать тип ошибки. Тип ошибки представляет из себя числовой код. Но коды знать и помнить не нужно. Например, параметр exception_errors_types. Что означает данная запись: E_ALL & ~E_NOTICE & ~E_WARNING & ~E_STRICT & ~E_USER_WARNING & ~E_USER_NOTICE & ~E_COMPILE_WARNING?
Возврат к списку
Если на экране появилась ошибка:
При выполнении скрипта возникла ошибка. Включить расширенный вывод ошибок можно в файле настроек .settings.php
Открываем файл .settings.php
находим debug
и заменяем false
на true
:
'exception_handling' =>
array (
'value' =>
array (
'debug' => false, // изменяем значение на true
'handled_errors_types' => 20853,
'exception_errors_types' => 20853,
'ignore_silence' => false,
'assertion_throws_exception' => true,
'assertion_error_type' => 256,
'log' =>
array (
'settings' =>
array (
'file' => NULL,
'log_size' => NULL,
),
),
),
'readonly' => false,
),
В результате чего на экране будет подробное описание ошибки:
[Error]
Class 'Assets' not found (0)
D:worklocalhost11wwwlocaltemplatesvoguis_indexheader.php:17
#0: include_once
D:worklocalhost11wwwbitrixmodulesmainincludeprolog_after.php:96
#1: require(string)
D:worklocalhost11wwwbitrixmodulesmainincludeprolog.php:11
#2: require_once(string)
D:worklocalhost11wwwbitrixheader.php:1
#3: require(string)
D:worklocalhost11wwwindex.php:2