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