Меню


Курсы СтимулСправочникПолезные материалы1С:Предприятие 8.2РазработчикамСоглашения при написании ко…

1С:Предприятие 8.2 /
Разработчикам /
Соглашения при написании кода

Оглавление

Перехват исключений в коде

В общем случае, не рекомендуется перехватывать исключение только ради выдачи сообщения об ошибке. Необработанное исключение в любом случае будет выдано пользователю в виде сообщения об ошибке.

Тем не менее, необходимость перехвата исключений в коде все же возникает. Например, для того чтобы уточнить текст ошибки, дополнив его прикладной, понятной конечному пользователю, информацией. Однако при этом необходимо фиксировать причину ошибки в журнале регистрации для того, чтобы системный администратор имел возможность выполнить диагностику проблемы и при необходимости передать информацию об ошибке в службу технической поддержки.

Рекомендуется записывать в журнал регистрации подробное представление исключения, а краткое представление добавлять в текст сообщения пользователю.

Пример №1. Если имеется некоторая серверная бизнес-логика, которая вызывается с клиента при интерактивной работе пользователя:

&НаСервере
 Процедура  ВыполнитьОперацию()
// код, приводящий к вызову исключения
....
 КонецПроцедуры 

то неправильно:

 

// на  клиенте  
Попытка 
ВыполнитьОперацию();
Исключение
Предупреждение(" Операция  не может быть выполнена.");
КонецПопытки;

Правильно:

&НаСервере
 Процедура  ВыполнитьОперацию()
	Попытка 
		// код, приводящий к вызову исключения
		....
	Исключение
		// Запись  события  в журнал  регистрации  для системного  администратора .
		ЗаписьЖурналаРегистрации(НСтр("ru = 'Выполнение  операции '"),
		УровеньЖурналаРегистрации.Ошибка,,,
		ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
		ВызватьИсключение;
	КонецПопытки;
КонецПроцедуры

и тогда на клиенте:

Попытка 
	ВыполнитьОперацию();
Исключение
	ТекстСообщения = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
	Предупреждение(НСтр("ru = 'Операция не может быть выполнена по  причине :'") + Символы.ПС + ТекстСообщения);
КонецПопытки;

Пример №2. Если имеется некоторая клиентская бизнес-логика:

&НаКлиенте
Процедура СоздатьФайлНаДиске()
// код, приводящий к вызову исключения
....
КонецПроцедуры

то рекомендуется делать дополнительный серверный вызов для протоколирования неудачного результата операции в журнал регистрации:

 
 
 Попытка 
	 // код, приводящий к вызову исключения
	 СоздатьФайлНаДиске();
 Исключение
	 ТекстСообщения = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
	 Предупреждение(НСтр("ru = 'Операция не может быть выполнена по причине:'") + Символы.ПС + ТекстСообщения);
	 ЗаписьОшибкуРаботыСФайлами(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())));
 КонецПопытки
 
 
 &НаСервере
 Процедура ЗаписьОшибкуРаботыСФайлами(...)
	 ЗаписьЖурналаРегистрации(НСтр("ru = 'Выполнение операции'"),
	 УровеньЖурналаРегистрации.Ошибка,,,
	 ПодробноеПредставлениеОшибки);
 КонецПроцедуры

Пример № 3. Недопустимо перехватывать любые исключения, бесследно для системного администратора:

 
 
 Попытка 
	 // код, приводящий к вызову исключения
	 ....
 Исключение // перехват любых исключений
 КонецПопытки;

Как правило, подобная конструкция скрывает реальную проблему, которую впоследствие невозможно диагностировать.
Правильно:

Попытка 
	// код, приводящий к вызову исключения
	....
Исключение
	// Пояснение причин перехвата всех исключений "незаметно" от  пользователя .
	// ....
	// И запись  события  в журнал регистрации для системного администратора.
	ЗаписьЖурналаРегистрации(НСтр("ru = 'Выполнение операции'"),
	УровеньЖурналаРегистрации.Ошибка,,,
	ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;

Пример № 4. При использовании транзакций следует придерживаться следующей схемы обработки исключений в коде на сервере:

НачатьТранзакцию();
Попытка
	Запрос = Новый Запрос("...");
	Выборка = Запрос.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл
		... 
	КонецЦикла; 
	
	ЗафиксироватьТранзакцию();
Исключение
	ОтменитьТранзакцию();
	ЗаписьЖурналаРегистрации(НСтр("ru = 'Выполнение операции'"), УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
	ВызватьИсключение;
КонецПопытки;

Поскольку исключение не отменяет транзакцию сразу, но запрещает успешное завершение транзакции, то все вызовы НачатьТранзакцию, с одной стороны, и ЗафиксироватьТранзакцию или ОтменитьТранзакцию, с другой стороны, должны быть парными.


Нас находят: исключение 1с, https://stimul kiev ua/materialy htm?a=perekhvat_isklyucheniy_v_kode, ИнформацияОбОшибке 1с, 1с вызватьисключение, как вызвать исключение 1с, процедура ВыполнитьОперацию() в 1с, как вызвать исключение в попытке в 1с, ЗафиксироватьТранзакцию(); Исключение, ЗаписьЖурналаРегистрации в исключении, вызватьисключение 1с


Подписка на новости RSS

Мы на Facebook