Каталог решений - О вложенных попытках, исключениях и о представлении ошибок

О вложенных попытках, исключениях и о представлении ошибок

О вложенных попытках, исключениях и о представлении ошибок

В наличии

В данной статье, на небольшом примере, мне бы хотелось показать, как себя ведут вложенные «Попытка-Исключение». А также о том, чем отличаются методы ОписаниеОшибки() и ИнформацияОбОшибке().

Категория:

Описание

Вопрос знатокам: какое сообщение будет выведено пользователю после выполнения данного кода?

  &НаКлиенте
  Процедура ВызватьОшибкуБезВызоваИсключения(Команда)
  	
  	Попытка
  		ВызватьОшибкуБезВызоваИсключенияНаСервере();
  	Исключение
  		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
  	КонецПопытки;
  	
  КонецПроцедуры
  
  &НаСервере
  Процедура ВызватьОшибкуБезВызоваИсключенияНаСервере()
  	
  	Попытка
  		А = ОбщегоНазначения.ЗначениеРеквизитаОбъекта();
  	Исключение
  	КонецПопытки;
  	
  КонецПроцедуры

Логично предположить, что это будет что-то вроде "Недостаточно фактических параметров". Но на самом деле сообщение вообще не будет выведено.

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

Как исправить? Достаточно просто: нужно лишь добавить оператор ВызватьИсключение во вложенную попытку, например, вот так:

  &НаСервере
  Процедура ВызватьОшибкуБезВызоваИсключенияНаСервере()
  	
  	Попытка
  		А = ОбщегоНазначения.ЗначениеРеквизитаОбъекта();
  	Исключение
  		ВызватьИсключение;
  	КонецПопытки;
  	
  КонецПроцедуры

Теперь давайте разберемся в том, какие описания ошибок будут возникать. В следующем примере, в комментарии после каждой переменной, привожу содержимое этой переменной:

  &НаКлиенте
  Процедура ВызватьОшибку(Команда)
  	
  	Попытка
  		ВызватьОшибкуНаСервере();
  	Исключение
  		Описание = ОписаниеОшибки();
  		// {ВнешняяОбработка.ОписаниеОшибки.Форма.Форма.Форма(20)}: Не удалось получить значение реквизита по причине: {ВнешняяОбработка.ОписаниеОшибки.Форма.Форма.Форма(6)}: Недостаточно фактических параметров
  		
  		Информация = ИнформацияОбОшибке();
  		
  		КраткоеПредставление = КраткоеПредставлениеОшибки(Информация);
  		// Не удалось получить значение реквизита по причине: {ВнешняяОбработка.ОписаниеОшибки.Форма.Форма.Форма(6)}: Недостаточно фактических параметров
  		
  		ПодробноеПредставление = ПодробноеПредставлениеОшибки(Информация);
  		// Не удалось получить значение реквизита по причине: {ВнешняяОбработка.ОписаниеОшибки.Форма.Форма.Форма(6)}: Недостаточно фактических параметров
  		// {ВнешняяОбработка.ОписаниеОшибки.Форма.Форма.Форма(20)}:		ВызватьИсключение "Не удалось получить значение реквизита по причине: " + Описание;
  		// {ВнешняяОбработка.ОписаниеОшибки.Форма.Форма.Форма(29)}:		ВызватьОшибкуНаСервере();
  		
  		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(КраткоеПредставление);
  		// Не удалось получить значение реквизита по причине: {ВнешняяОбработка.ОписаниеОшибки.Форма.Форма.Форма(30)}: Недостаточно фактических параметров
  	КонецПопытки;
  	
  КонецПроцедуры
  
  &НаСервере
  Процедура ВызватьОшибкуНаСервере()
  	
  	Попытка
  		А = ОбщегоНазначения.ЗначениеРеквизитаОбъекта();
  	Исключение
  		Описание = ОписаниеОшибки();
  		// {ВнешняяОбработка.ОписаниеОшибки.Форма.Форма.Форма(6)}: Недостаточно фактических параметров
  		
  		Информация = ИнформацияОбОшибке();
  		// Информация.ИмяМодуля = "ВнешняяОбработка.ОписаниеОшибки.Форма.Форма.Форма"
  		// Информация.ИсходнаяСтрока = "		А = ОбщегоНазначения.ЗначениеРеквизитаОбъекта();"
  		// Информация.НомерСтроки = 30
  		// Информация.Описание = "Недостаточно фактических параметров"
  		// Информация.Причина = Неопределено
  		
  		КраткоеПредставлениеОшибки(Информация);
  		// Недостаточно фактических параметров
  		
  		ПодробноеПредставлениеОшибки(Информация);
  		// Недостаточно фактических параметров
  		// {ВнешняяОбработка.ОписаниеОшибки.Форма.Форма.Форма(6)}:		А = ОбщегоНазначения.ЗначениеРеквизитаОбъекта();
  		
  		ВызватьИсключение "Не удалось получить значение реквизита по причине: " + Описание;
  	КонецПопытки;
  	
  КонецПроцедуры

 

has been added to your cart:
Оформление заказа