1С:Предприятие 8.2 /
Разработчикам /
Соглашения при написании кода
Перехват исключений в коде
В общем случае, не рекомендуется перехватывать исключение только ради выдачи сообщения об ошибке. Необработанное исключение в любом случае будет выдано пользователю в виде сообщения об ошибке.
Тем не менее, необходимость перехвата исключений в коде все же возникает. Например, для того чтобы уточнить текст ошибки, дополнив его прикладной, понятной конечному пользователю, информацией. Однако при этом необходимо фиксировать причину ошибки в журнале регистрации для того, чтобы системный администратор имел возможность выполнить диагностику проблемы и при необходимости передать информацию об ошибке в службу технической поддержки.
Рекомендуется записывать в журнал регистрации подробное представление исключения, а краткое представление добавлять в текст сообщения пользователю.
Пример №1. Если имеется некоторая серверная бизнес-логика, которая вызывается с клиента при интерактивной работе пользователя:
&НаСервере Процедура ВыполнитьОперацию() // код, приводящий к вызову исключения .... КонецПроцедуры
то неправильно:
// на клиенте Попытка ВыполнитьОперацию(); Исключение Предупреждение(" Операция не может быть выполнена."); КонецПопытки;
Правильно:
&НаСервере Процедура ВыполнитьОперацию() Попытка // код, приводящий к вызову исключения .... Исключение // Запись события в журнал регистрации для системного администратора . ЗаписьЖурналаРегистрации(НСтр("ru = 'Выполнение операции '"), УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение; КонецПопытки; КонецПроцедуры
и тогда на клиенте:
Попытка ВыполнитьОперацию(); Исключение ТекстСообщения = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); Предупреждение(НСтр("ru = 'Операция не может быть выполнена по причине :'") + Символы.ПС + ТекстСообщения); КонецПопытки;
Пример №2. Если имеется некоторая клиентская бизнес-логика:
&НаКлиенте Процедура СоздатьФайлНаДиске() // код, приводящий к вызову исключения .... КонецПроцедуры
то рекомендуется делать дополнительный серверный вызов для протоколирования неудачного результата операции в журнал регистрации:
Попытка // код, приводящий к вызову исключения СоздатьФайлНаДиске(); Исключение ТекстСообщения = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); Предупреждение(НСтр("ru = 'Операция не может быть выполнена по причине:'") + Символы.ПС + ТекстСообщения); ЗаписьОшибкуРаботыСФайлами(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); КонецПопытки
&НаСервере Процедура ЗаписьОшибкуРаботыСФайлами(...) ЗаписьЖурналаРегистрации(НСтр("ru = 'Выполнение операции'"), УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки); КонецПроцедуры
Пример № 3. Недопустимо перехватывать любые исключения, бесследно для системного администратора:
Попытка // код, приводящий к вызову исключения .... Исключение // перехват любых исключений КонецПопытки;
Как правило, подобная конструкция скрывает реальную проблему, которую впоследствие невозможно диагностировать.
Правильно:
Попытка // код, приводящий к вызову исключения .... Исключение // Пояснение причин перехвата всех исключений "незаметно" от пользователя . // .... // И запись события в журнал регистрации для системного администратора. ЗаписьЖурналаРегистрации(НСтр("ru = 'Выполнение операции'"), УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки;
Пример № 4. При использовании транзакций следует придерживаться следующей схемы обработки исключений в коде на сервере:
НачатьТранзакцию(); Попытка Запрос = Новый Запрос("..."); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл ... КонецЦикла; ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); ЗаписьЖурналаРегистрации(НСтр("ru = 'Выполнение операции'"), УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение; КонецПопытки;
Поскольку исключение не отменяет транзакцию сразу, но запрещает успешное завершение транзакции, то все вызовы НачатьТранзакцию, с одной стороны, и ЗафиксироватьТранзакцию или ОтменитьТранзакцию, с другой стороны, должны быть парными.
Другие материалы по теме:
ошибка, иначе, конецпроцедуры, администратор, журнал, буфер обмена, копировать, код, обмен, конфигурирование, пример, регистр, операции
Материалы из раздела: 1С:Предприятие 8.2 / Разработчикам / Соглашения при написании кода
Другие материалы по теме:
Использование привилегированного режима
Нас находят: исключение 1с, https://stimul kiev ua/materialy htm?a=perekhvat_isklyucheniy_v_kode, ИнформацияОбОшибке 1с, 1с вызватьисключение, как вызвать исключение 1с, процедура ВыполнитьОперацию() в 1с, как вызвать исключение в попытке в 1с, ЗафиксироватьТранзакцию(); Исключение, ЗаписьЖурналаРегистрации в исключении, вызватьисключение 1с
Мы на Facebook