1С:Предприятие 8.2 /
Разработчикам /
Соглашения при написании кода
Перехват исключений в коде
Частные случаи некорректного использования и перехвата исключений
Область применения: управляемое приложение, мобильное приложение, обычное приложение.
В общем случае не рекомендуется перехватывать исключения. В частности не нужно перехватывать исключения только ради выдачи сообщения об ошибке. Необработанное исключение в любом случае будет выдано пользователю в виде сообщения об ошибке.
Тем не менее необходимость перехвата исключений в коде все же возникает. Например, для того чтобы уточнить текст ошибки, дополнив его прикладной, понятной конечному пользователю , информацией. Однако при этом необходимо фиксировать причину ошибки в журнале регистрации для того, чтобы системный администратор имел возможность выполнить диагностику проблемы и при необходимости передать информацию об ошибке в службу технической поддержки.
Рекомендуется записывать в журнал регистрации подробное представление исключения, а краткое представление добавлять в текст сообщения пользователю .
Частные случаи некорректного использования и перехвата исключений
Область применения (уточнение): управляемое приложение, обычное приложение. 1. Если имеется некоторая серверная бизнес-логика, которая вызывается с клиента при интерактивной работе пользователя:
то неправильно:
Правильно:
и тогда на клиенте:
2. Если имеется некоторая клиентская бизнес-логика:
то рекомендуется делать дополнительный серверный вызов для протоколирования неудачного результата операции в журнал регистрации:
3. Недопустимо перехватывать любые исключения, бесследно для системного администратора:
Как правило , подобная конструкция скрывает реальную проблему, которую впоследствие невозможно диагностировать.
См. также Доступ к файловой системе из кода конфигурации , удаление временных файлов |
4. Недопустимо делать проверки наличия у объекта реквизитов, методов, макетов и т.п., используя для этого исключения, т.к. это может привести к сложно диагностируемым ошибкам, а также затрудняет отладку в режиме «Останавливаться по ошибке».
Вместо перехвата исключений в этом случае рекомендуется:
- использовать механизмы работы с метаданными, чтобы явным образом проверять наличие или отсутствие реквизита (макета и т.п.);
- если различия связаны с особенностями встраивания библиотек – описывать особенности явным образом в переопределяемых модулях (см. Переопределяемые и поставляемые объекты);
- пересмотреть логику работы методов, использующих перехват исключений. Например, можно предусмотреть параметры, которые определяются в вызывающем коде и указывают нужно или нет обращаться к какому-либо методу или свойству объекта.
Например, неправильно:
Попытка
КонтекстЭДОСервер.ПолучитьМакет("КомпонентаОбмена");
ПутьВК = КонтекстЭДОСервер.ПутьКОбъекту + ".Макет.КомпонентаОбмена";
Исключение
КонецПопытки;
Правильно:
МакетКомпонентыОбмена = КонтекстЭДОСервер.Метаданные().Макеты.Найти("КомпонентаОбмена");
Если МакетКомпонентыОбмена <> Неопределено Тогда
ПутьКМакету = КомпонентаОбмена.ПолноеИмя()
КонецЕсли;
5. При использовании транзакций следует придерживаться следующей схемы обработки исключений в коде на сервере:
НачатьТранзакцию();
Попытка
Запрос = Новый Запрос("...");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
...
КонецЦикла;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ЗаписьЖурналаРегистрации(НСтр("ru = 'Выполнение операции'"), УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
ВызватьИсключение;
КонецПопытки;
Поскольку исключение не отменяет транзакцию сразу, но запрещает успешное завершение транзакции, то все вызовы НачатьТранзакцию, с одной стороны, и ЗафиксироватьТранзакцию или ОтменитьТранзакцию, с другой стороны, должны быть парными.
6. Неправильно использовать исключения для приведения значения к типу. Для таких операций необходимо использовать возможности объекта ОписаниеТипов.
Например, неправильно:
Попытка
КоличествоДнейРазрешения = Число(Значение);
Исключение
КоличествоДнейРазрешения = 0; // значение по умолчанию
КонецПопытки;
Правильно:
ОписаниеТипа = Новый ОписаниеТипов("Число");
КоличествоДнейРазрешения = ОписаниеТипа.ПривестиЗначение(Значение);
Тренинг-семинар «Как получить работу бухгалтера»
Курсы бухгалтеров с трудоустройством
Курсы программирования 1С:Предприятие 8.2
Другие материалы по теме:
бизнес, делать, представление, ошибка, события, конецпроцедуры, администратор, журнал, ошибки, опис, код, выполнить, обмен, по умолчанию, например, операция, объект, параметры, работы, пример, значение, регистр, операции
Материалы из раздела: 1С:Предприятие 8.2 / Разработчикам / Соглашения при написании кода
Другие материалы по теме:
Особенности масштабирования по выбранному объекту
Подтверждение завершения работы с программой
Нормативно-справочная информация: учет взаиморасчетов с контрагентами
Мы на Facebook