Использование Попыток в коде (черновик)
https://forum.mista.ru/topic.php?id=587908
Попытка - это транзакция, использование ее в других транзакция может привести к не всегда очевидным последствиям отмены транзакции-родителя. Использование оператора Попытка оправдано лишь в случае когда нет другого способа проверки корректности исполняемого кода. К примеру удаление файла с диска, есть файл или нет мы гарантировать системе не можем. (Для особо дотошных: после проверки на то что файл физически существует и до строки с удалением этого файла он может быть удален другим процессом).
меня с детства учили, что и попытка, и метка - одного уровня зло
Использую только в тех случаях, когда проверить корректность исполняемого кода невозможно стандартными методами, и еще когда трудоемкость локализации всех возможных ошибок значительно превышает разумные пределы (при сложных обменах с загрузками/выгрузками часто бывает).
я у нас для других программистов вот такую заметку про попытку сделал:
- Чем их меньше, тем лучше. Рассматривайте попытку и переход по исключению в блок исключение как неявный GoTo.
- Если можно обойтись без попытки, нужно обойтись без попытки. Например при преобразовании строки в число можно написать
Попытка Возврат Число(стрЧисло); Исключение КонецПопытки;
и ловить исключение каждый раз при возведенном флажке "Останавливаться на ошибке" или можно написать сложнее:
Возврат ТолькоЦифрыВСтроке() или Еще есть такой вариант ОписаниеТипа = Новый ОписаниеТипов(“Число”); Текчисло = ОписаниеТипа.ПривестиЗначение(ТекстовоеПоле);
но код не будет генерить ненужных исключений
- любая ошибка внутри транзакции рвет эту транзакцию, поэтому внутри транзакции можно не пытаться ловить ошибки, если не предусмотрен полный выход из транзакции
- если есть подозрения, что код может работать некорректно, то нужно сделать все, чтобы устранить эту неопределенность, а не совать его в попытку, чтоб разбирались другие программисты
- за код типа
Попытка СделатьЧтото(); Исключение КонецПопытки;
будут отстреливаться лишние органы. В блоке исключение ВСЕГДА (ВСЕГДА, блеать!!!) должен быть код по отработке, иначе потом нереально найти что рвет транзакцию 6) Использовать попытку нужно -для проверки входных параметров в код, которые мы не можем проверить еще выше. Это актуально для методов-баррикад (Совершенный код, 198 страница) -для вызова методов, предугадать результат которых мы не можем, например вызов кода внешней обработки, которая будет независимо обновляться (те же баррикады) -для вызова методов, которые сами генерят исключения, например подключение компоненты