Когда правильно использовать функцию ВызыватьИсключение?
Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа.
Возврат;
КонецЕсли;
Если НЕ Пользователи.ЭтоПолноправныйПользователь(, Истина) Тогда
ВызватьИсключение НСтр("ru = 'Недостаточно прав доступа.
|
|Работа с регламентными и фоновыми заданиями
|выполняется только администраторами.'");
КонецЕсли;
Показать
Вот пример кода из типовой. В первом условие используется "Возврат". А во втором условии вызывается исключение.
(1) TODD22, что значит правильно?
Если ВызватьИсключение применяется в блоке Попытка-Исключение, то в исключение можно перехватить и обработать.
Если не в блоке, то перехват будет платформой и обработано стандартно: выдаст предупреждение пользователю с текстом, который указан в параметре ВызватьИсключение.
Не совсем понимаю когда надо использовать ВызовИсключения.
Вот в верхнем примере для чего вызывается исключение? Ведь можно например программно вывести сообщение пользователю и вернуть в вызывавшую процедуру например Непоределено. И уже в ней обработать по значению нужный алгоритм.
Не понимаю почему именно вызывается исключение а не описывается программная обработка условия.
При использовании вложенных транзакций в конце блока Исключение рекомендуется добавить оператор ВызватьИсключение. В противном случае исключение не будет передано выше по стеку вызовов, там не сработает обработка исключения, внешняя транзакция не будет явным образом отменена и платформа вызовет исключение «В данной транзакции происходила ошибка»
(5)
(3) TODD22, Вот чтобы не писать все возможные обработки не штатной ситуации.
ВызватьИсключение прерывает весь дальнейший код, без возврата. Игнорируется вся цепочка вызывов. Обратного возвращение по цепочке не происходит.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("АвтоТест") Тогда
Возврат;
КонецЕсли;
ВызватьИсключение НСтр("ru='Обработка не предназначена для непосредственного использования.'");
КонецПроцедуры
Показать
Или вот например почему не Отказ=Истина? Или это что бы показать сообщение пользователю так сделали? Процедура же на сервере выполняется.
(7) TODD22, Отказ нужно где то обрабатывать, а вот к примеру ты что то пишешь... вызываешь какую то функцию она тебе что то возвращает, но если тебе нужно не зависимо от того что она возвращает остановить процесс, если была ошибка, вставляешь в вызываемой функции ВызватьИсключение и все... ну а потом уже допиливаешь обработчики чтоб не было исключений
(7) TODD22, в данном случае объект (документ, обработка) можно открывать не только интерактивно, но и программно. И на этом построена логика вызывающего метода. Если сделать Отказ = Истина, то при программном вызове возможно будет выброшено исключение на работу с ней. Попытка что-то записать в поле, или вызов метода. Но т.к. создание формы не произошло, выбросится исключение в не нужном (не предсказуемом) месте.
А так, полностью выбрасывается исключение, без возврата.
В первые пришлось самому писать код с вызовом исключения.
Если исключение не в попытке, то оно просит параметр. Думал вывести сообщение и затем исключение.
Как итог текст сообщения в параметр добавил и вопрос закрыт. Сообщение не выводил.
Есть ньюанс, с 8.3.17 любое исключение показывается пользователю как "Возникла непредвиденная ошибка"
(если не включен режим отладки) и требует сформировать отчет об ошибке.