Skip to content

Latest commit

 

History

History
48 lines (33 loc) · 4.59 KB

try_catch_wrong_usage.md

File metadata and controls

48 lines (33 loc) · 4.59 KB

Использование Попыток в коде (черновик)

https://forum.mista.ru/topic.php?id=587908

Попытка - это транзакция, использование ее в других транзакция может привести к не всегда очевидным последствиям отмены транзакции-родителя. Использование оператора Попытка оправдано лишь в случае когда нет другого способа проверки корректности исполняемого кода. К примеру удаление файла с диска, есть файл или нет мы гарантировать системе не можем. (Для особо дотошных: после проверки на то что файл физически существует и до строки с удалением этого файла он может быть удален другим процессом).

меня с детства учили, что и попытка, и метка - одного уровня зло

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

я у нас для других программистов вот такую заметку про попытку сделал:

  1. Чем их меньше, тем лучше. Рассматривайте попытку и переход по исключению в блок исключение как неявный GoTo.
  2. Если можно обойтись без попытки, нужно обойтись без попытки. Например при преобразовании строки в число можно написать

Попытка Возврат Число(стрЧисло); Исключение КонецПопытки;

и ловить исключение каждый раз при возведенном флажке "Останавливаться на ошибке" или можно написать сложнее:

Возврат ТолькоЦифрыВСтроке() или Еще есть такой вариант ОписаниеТипа = Новый ОписаниеТипов(“Число”); Текчисло = ОписаниеТипа.ПривестиЗначение(ТекстовоеПоле);

но код не будет генерить ненужных исключений

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

Попытка СделатьЧтото(); Исключение КонецПопытки;

будут отстреливаться лишние органы. В блоке исключение ВСЕГДА (ВСЕГДА, блеать!!!) должен быть код по отработке, иначе потом нереально найти что рвет транзакцию 6) Использовать попытку нужно -для проверки входных параметров в код, которые мы не можем проверить еще выше. Это актуально для методов-баррикад (Совершенный код, 198 страница) -для вызова методов, предугадать результат которых мы не можем, например вызов кода внешней обработки, которая будет независимо обновляться (те же баррикады) -для вызова методов, которые сами генерят исключения, например подключение компоненты