Попытка не пытка

04.03.24

Разработка - Механизмы платформы 1С

Есть мнение, что использование в наших проектах синтаксической конструкции Попытка – Исключение существенно влияет на производительность платформы. Иными словами, не стоит повсеместно использовать Попытку. Можешь обойтись без исключения? Обойдись! А как на самом деле обстоят дела с обработкой исключения и производительностью платформы? В статье описаны результаты тестирования использования в коде синтаксической конструкции «Попытка - Исключение». И да, картинку для публикации нарисовал "второй пилот Bing".

Для тех, кто торопится

Итак, для тех, кому некогда читать эту замечательную статью, сразу даю результат исследования. И так, синтаксическая конструкция «Попытка - Исключение» не оказывает хоть сколь-нибудь заметного влияния на скорость выполнения вашего кода, в случае, когда все работает штатно и исключение не было вызвано.

 

Для тех, кому интересны подробности

Как работает «Попытка - Исключение» в платформе

Чтобы разобраться с механизмом обработки исключений, нам придется заглянуть под капот нашей любимой платформы. Вся следующая информация взята из фундаментальных работ Андрея Овсянкина про устройство интерпретатора платформы:

 

 

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

Рассмотрим следующий пример:

Процедура ГенераторНоменклатуры(КоличествоЭлемнтов) Экспорт
    Для индекс = 1 По КоличествоЭлемнтов Цикл
        Попытка
            // Тело блока «Попытка»
            НоваяНоменклатура(индекс);
        Исключение
            // Обработчик исключения
            ВызватьИсключение "Ошибка исполнения";
        КонецПопытки;
    КонецЦикла;
КонецПроцедуры

При компиляции этого метода в байт-код произойдёт следующая трансформация:

Ключевое слово Попытка будет скомпилировано в опкод (операционный код)

BeginTry <адрес начала блока обработчика исключения>

Тело блока «Попытка» будет скомпилировано штатным образом. То, что наш прикладной код находится внутри попытки, на компиляцию не повлияет.

В конце блока кода, помещенного в Попытку, будут добавлены следующие опкоды:

BlckEnd 1
Jmp <адрес первой инструкции за пределами блока обработчика ошибки>

BlckEnd это какой-то специализированный оператор очистки конца блока. Jmp это оператор безусловного перехода.

Блок Исключение завершается оператором.

EndTry

Таким образом при исполнении нашего прикладного кода, помещенного в попытку, дополнительно платформой будет выполнено:

  1. Опкод BeginTry, который поместит на стек адрес начала обработчика исключения, иными словами адрес начала блока «Исключение – КонецПопытки»
  2. После успешного выполнения нашего прикладного кода будет выполнен опкод BlckEnd, который выполнит некую очистку, наверное, будет очищен блок «Исключение - КонецПопытки», но я до конца не уверен. Также я ожидаю, что этот опкод снимет со стека теперь уже ненужный адрес начала обработчика исключений.
  3. Далее будет выполнен принудительный переход за пределы блока «Исключение - КонецПопытки»

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

Я пристал к коллегам в Телеграм чате https://t.me/oscript_library и на мой вопрос: «Что происходит с кодом, который помещен в обработчик ошибок», Андрей Овсянкин ответил:

 

Ничего не происходит. Можно посмотреть исходники 1Скрипта, не думаю, что в оригинальной 1С сильно отличается. При слове "Попытка" фиксируется адрес "обработчика" - начало блока Исключение. Если происходит исключение (например, поделили на ноль, вышли за границу массива или бог знает что еще), то исключение ловится, оборачивается в ИнформацияОбОшибке и управление переходит в "обработчик". Изучать то, что происходит в скриптовом движке при исключениях, не имеет смысла. Т. к. он написан на языке, уже имеющем исключения, как концепт. Исключения влияют на что-то только если сравнивать на более низких уровнях, как блок try-catch выглядит на уровне чистого Си или АСМ.

 

Проверка практикой

Несмотря на крепкую теорию, я все равно решил проверить ее на практике. Давайте нагрузим нашу платформу и выясним, какое влияние оказывает конструкция «Попытка – Исключение» на скорость выполнения кода. Для проверки была подготовлена тестовая конфигурация с различными вариантами проверки.

 

Тестовый стенд

Характеристики тестового стенда были следующие:

  • Платформа: 8.3.24.1439
  • Конфигурация: «Демонстрационная информационная база» с добавленными тестовыми сценариями.
  • База: файловая и клиент-сервер MS SQL

 

Тестовые сценарии

Все тестовые сценарии были выполнены по 10 раз на файловой и на клиент-серверной базе.

Тестовый сценарий "Прикладной код работает с памятью"

Сценарий, работающий с памятью, создает упорядоченный массив из трех тысяч чисел, а затем сортирует его пузырьком в обратном порядке.

Первый тест – сценарий выполняется без обработки исключения, то есть конструкция «Попытка - Исключение» отсутствует.

Второй тест – весь сценарий помещен в одну конструкцию «Попытка – Исключение». Таким образом одна попытка на обработку всех 3000 элементов массива.

Третий тест – каждая итерация перестановки при сортировке пузырьком помещена в конструкцию «Попытка – Исключение». Таким образом попытка была на каждый элемент массива.

Результат теста:

Файловая база.

 

Тест 1, сек. Тест 2, сек. Тест 3, сек.
18,6813 18,1613 19,368

 

 

Клиент-серверная база.

 

Тест 1, сек. Тест 2, сек. Тест 3, сек.
19,846 18,7074 20,4655

 

 

Тестовый сценарий "Прикладной код работает с базой"

Сценарий, работающий с базой, создавал и записывал в базу пять тысяч элементов справочника Номенклатура. Сценарий выполнялся в транзакции. После завершения сценария транзакция откатывалась, чтобы забивать базу данными.

Первый тест – сценарий выполняется без обработки исключения, то есть конструкция «Попытка - Исключение» отсутствует.

Второй тест – весь сценарий помещен в одну конструкцию «Попытка – Исключение». Таким образом одна попытка на создание всех 5000 записей справочника.

Третий тест – запись каждого элемента справочника помещена в свою конструкцию «Попытка – Исключение». Таким образом, попытка была на каждый записываемый элемент справочника.

Результат теста:

Файловая база.

 

Тест 1, сек. Тест 2, сек. Тест 3, сек.
14,0597 14,197 14,1784

 

 

Клиент-серверная база.

 

Тест 1, сек. Тест 2, сек. Тест 3, сек.
18,6108 18,4252 18,418

 

 

 

Выводы

Во всех хороших статьях есть выводы. Моя статья хорошая.

Итак, заключение прикладного кода в конструкцию Попытка – Исключение не оказывает влияния на производительность платформы, если в процессе выполнения не произошло ошибок. Если вы, как и я, опасались лишний раз использовать попытку в своем коде, можете расслабиться, медленнее ваш код работать не станет.

 

Бонус

И в завершении статьи хотел напомнить о рекомендациях компании 1С. Я уверен, что все это у вас и так как от зубов отскакивает, но вдруг кто-то подзабыл. Итак, на ИТС есть следующие руководства по использованию конструкции Попытка – Исключение:

Перехват исключений в коде. Стандарты разработки.

Обработка исключений. Методическая поддержка.

Руководство разработчика. Платформа 1С:Предприятие 8.3.25. Глава 4.

Также хочу напомнить, что начиная с версии платформы 8.3.21 у нас появилась возможность вызывать исключения не только как оператор, но и как функцию с параметрами. Например, теперь нам доступна вот такая красота:

ВызватьИсключение ("Документ не может быть проведен", КатегорияОшибки.ОшибкаКонфигурации, 
                   "ERR.DOCS.0001", "Клиенту запрещена отгрузка");

Теперь при обработке исключения нам доступны все параметры, которые были указаны при вызове исключения. Чувствуете, все как в "серьезных" языках программирования? Но, если честно, это очень крутая фишка платформы.

 

Всем спасибо за внимание.

Если статья вам понравилась, буду рад вашему плюсику.

И да, вы можете использовать эту статью как вам угодно, при условии указания автора статьи.

См. также

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    7424    bayselonarrend    20    

154

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    5938    dsdred    16    

80

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    17644    YA_418728146    26    

71

Перенос данных 1C Механизмы платформы 1С Системный администратор Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    11216    dsdred    44    

130

Механизмы платформы 1С Программист Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    23752    SeiOkami    48    

135

Механизмы платформы 1С Системный администратор Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    18821    human_new    27    

80

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    14726    YA_418728146    7    

166
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. artbear 1563 04.03.24 10:02 Сейчас в теме
ВызватьИсключение ("Документ не может быть проведен", КатегорияОшибки.ОшибкаКонфигурации,
"ERR.DOCS.0001", "Клиенту запрещена отгрузка");


а еще важно, что можно передать и предыдущие данные об ошибке
- т.е. сохранить стек вызовов

нужно в коде обработки исключения в блоке Исключение написать
Попытка
   ...
Исключение

  ВызватьИсключение ("Документ не может быть проведен", КатегорияОшибки.ОшибкаКонфигурации, 
                   "ERR.DOCS.0001", "Клиенту запрещена отгрузка", 
                   ИнформацияОбОшибке());

КонецПопытки;
Показать
sulfur17; Рамзес; Tavalik; tormozit; dabu-dabu; JohnyDeath; ardn; infosoft-v; +8 Ответить
8. gybson 04.03.24 14:19 Сейчас в теме
(1) При возникновении исключения прервется выполнение операций. Вы хотите знать насколько быстро это произойдет? Ну допустим M миллисекунд. С чем их сравнивать? Странное исследование. Типа как быстро закричат пользователи, если обесточить сервер.
16. tormozit 7229 04.03.24 18:30 Сейчас в теме
(1) Так можно делать начиная с 8.3.21. Важно, что при работе с подключенным отладчиком тут НЕ теряется "живой" указатель на строку первичного исключения. На каждый такой перевыброс исключения добавляется новый живой указатель.
Например для исключения
	Попытка
		я = 1/0;
	Исключение
		  ВызватьИсключение("Документ не может быть проведен",,,, ИнформацияОбОшибке());
	КонецПопытки;

Получим в конфигураторе сообщение с двумя живыми указателями (подкрасил их на картинке)
Документ не может быть проведен
{ВнешняяОбработка.ВнешняяОбработкаяяя1.Форма.Форма1.Форма(6)}:		  ВызватьИсключение("Документ не может быть проведен",,,, ИнформацияОбОшибке());
по причине:
{ВнешняяОбработка.ВнешняяОбработкаяяя1.Форма.Форма1.Форма(4)}: Деление на 0
		  ВызватьИсключение("Документ не может быть проведен",,,, ИнформацияОбОшибке());
Деление на 0 
{ВнешняяОбработка.ВнешняяОбработкаяяя1.Форма.Форма1.Форма(4)}:		я = 1/0;
Прикрепленные файлы:
Tavalik; user725774; infosoft-v; +3 Ответить
2. Evil Beaver 8243 04.03.24 10:35 Сейчас в теме
Эх, я так ждал в конце исследование о том, как влияет на работу наличие ошибки, т.е. что будет, если исключение все же возникло, т.к. мне и самому интересен ответ на этот вопрос. Ждем еще одной статьи, а за эту - большое спасибо!
user2065162; Tavalik; CheBurator; Brawler; artbear; Mowl; infosoft-v; +7 Ответить
4. Mowl 04.03.24 11:00 Сейчас в теме
(2)Плюсую. Еще интересно, что происходит при пустом ВызватьИсключение
5. Evil Beaver 8243 04.03.24 11:02 Сейчас в теме
(4) ну тут все предельно просто. При чистом ВызватьИсключение происходит чистый "throw;" на уровне кода платформы. Тут других вариантов быть не может, на мой взгляд. Обычный rethrow, вряд ли там сделаны какие-то еще манипуляции с пойманным исключением.
6. artbear 1563 04.03.24 11:17 Сейчас в теме
(2)
Эх, я так ждал в конце исследование о том, как влияет на работу наличие ошибки, т.е. что будет, если исключение все же возникло, т.к. мне и самому интересен ответ на этот вопрос.


ага, у меня отсутствие этой информации также вызвало разочарование в статье, хотя я и поставил плюс за нее
DrAku1a; Brawler; +2 Ответить
15. tormozit 7229 04.03.24 18:26 Сейчас в теме
(2) Эксперименты есть https://www.hostedredmine.com/issues/977782
Штраф за выброс исключения достаточно ощутимый. Например тест обращения к отсутствующему свойству структуры
ф = Новый Структура;
КоличествоПроходов = 10000;
Начало = ТекущаяУниверсальнаяДатаВМиллисекундах();
Для Счетчик = 1 По КоличествоПроходов Цикл
    Попытка
        я = ф.пупо;
    Исключение
    КонецПопытки;
КонецЦикла;
Сообщить("Замер1 = " + (ТекущаяУниверсальнаяДатаВМиллисекундах()-Начало) + "мс");
Начало = ТекущаяУниверсальнаяДатаВМиллисекундах();
Для Счетчик = 1 По КоличествоПроходов Цикл
    ф.Свойство("пупо", я);
КонецЦикла;
Сообщить("Замер2 = " + (ТекущаяУниверсальнаяДатаВМиллисекундах()-Начало) + "мс");
Показать

Выдает разницу в десятки раз в пользу метода Свойство()
Замер1 = 96мс
Замер2 = 3мс
sulfur17; itmind; dvsidelnikov; Tavalik; DrAku1a; ixijixi; Batman; fancy; infosoft-v; artbear; +10 Ответить
17. CheBurator 2712 04.03.24 18:43 Сейчас в теме
(2) причем если в обработке исключения вызвать какой-нибудь тяжелый код, процедуру/функцию...
3. gzharkoj 520 04.03.24 10:44 Сейчас в теме
В вашем тесте, самое тяжелое место - создание номенклатуры, то есть взаимодействие с дисковой подсистемой, оно сильно перекроет все по времени. Нужно тестировать чистый вычислительный код, где только процессор и память. Скорее всего, чтобы что-то увидеть надо еще и многопоточный вариант запустить и желательно с переходами с клиента на сервер, где попытка на клиенте и без.
Будет интересно.
kuzyara; SerVer1C; ixijixi; PowerBoy; artbear; +5 Ответить
7. gybson 04.03.24 14:15 Сейчас в теме
Повсеместно использовать попытку не стоит потому, что она повсеместно и не нужна. Если какой-то человек ставит "Попытку" просто на всякий, чтобы было, то проблемы производительности скорее всего не в попытке, а в человеке.
user2065162; kuzyara; +2 Ответить
9. kser87 2470 04.03.24 14:55 Сейчас в теме
Интересно, зависит ли это от какой-либо классификации ошибок. Например, с исключением падает запись/проведение и идет * транзакции. Или просто поиск элемента по индексу/ключу падает:

Итак, заключение прикладного кода в конструкцию Попытка – Исключение не оказывает влияния на производительность платформы, если в процессе выполнения не произошло ошибок. Если вы, как и я, опасались лишний раз использовать попытку в своем коде, можете расслабиться, медленнее ваш код работать не станет.
10. Brawler 458 04.03.24 15:32 Сейчас в теме
Нехватает описания какие накладные расходы происходят при возникновении ошибки. Как много памяти при этом тратится, как много объектов в мозгах платформы создается.
А еще не поругали за такое
Попытка
А = 1/0
Исключение
А = 1
КонецПопытки
12. SerVer1C 815 04.03.24 16:06 Сейчас в теме
(10) Сам перехват исключения достаточно сильно оказывает влияние на накладные расходы.

Итер = 1000000;


т1 = ТекущаяУниверсальнаяДатаВМиллисекундах();
	
Попытка Для й = 1 По Итер Цикл а = 1/0; КонецЦикла; Исключение а = 1; КонецПопытки;
	
т2 = ТекущаяУниверсальнаяДатаВМиллисекундах();
	
Сообщить("" + (т2 - т1) + " мс");
	
	
	
т1 = ТекущаяУниверсальнаяДатаВМиллисекундах();
	
Для й = 1 По Итер Цикл Попытка а = 1/0; Исключение а = 1; КонецПопытки; КонецЦикла;
	
т2 = ТекущаяУниверсальнаяДатаВМиллисекундах();
	
Сообщить("" + (т2 - т1) + " мс");
Показать


Результат следующий:
0 мс
26 458 мс

Если в исключение ни разу не падать, то время выполнения 220..250 мс

* Цикл-однострок используется специально для ускорения кода (для пропуска отладочных инструкций).
IDKFAIDDQD; Brawler; infosoft-v; +3 Ответить
13. SerVer1C 815 04.03.24 16:20 Сейчас в теме
(12) Дополню:

1М возвратов функции выполняется за 6 705 мс

Получается, что обработка исключения в 4 раза тяжелее переключения контекста методов.
infosoft-v; +1 Ответить
19. Brawler 458 04.03.24 19:33 Сейчас в теме
(12) Вот примерно это я и хотел в статье увидеть.
Просто полно деятелей которым влом написать так

Если Параметры.Свойство("ИмяСвойства") Тогда
А = Параметры.ИмяСвойства;
Иначе
А = 0;
КонецЕсли;


Они пишут так

Попытка
А = Параметры.ИмяСвойства;
Исключение
А = 0;
КонецПопытки

Примеры утрированные, но смысл передают.
И вот это вот в циклах конечно происходит или в многократно вызываемых методах, в тех же циклах.
Конечно есть ситуации где нет функции "Свойство" у объекта, но для этого у нас есть БСП.
11. awk 744 04.03.24 16:04 Сейчас в теме
А тест с подключенным отладчиком или нет?
14. infosoft-v 927 04.03.24 17:30 Сейчас в теме
(11) Отладка на сервере 1С Предприятие не была включена. Тесты запускались не в режиме отладки.
21. awk 744 05.03.24 10:33 Сейчас в теме
(14) Попробуйте все то же самое, но с включенной отладкой. Что-то мне подсказывает, что что-то измениться. 80% серверов работают с включенной отладкой на рабочих серверах.
25. JohnyDeath 302 09.03.24 10:30 Сейчас в теме
(21)
80% серверов работают с включенной отладкой на рабочих серверах

ССЗБ получается
18. пользователь 04.03.24 18:48
Сообщение было скрыто модератором.
...
20. mistervoron 11 05.03.24 09:13 Сейчас в теме
Интересная статья, спасибо!
22. kuzyara 2090 05.03.24 13:50 Сейчас в теме
Использование попыток в коде (копипаста с одного форума)

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

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

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

Ответ4: Чем их меньше, тем лучше. Рассматривайте попытку и переход по исключению в блок исключение как неявный GoTo. Если можно обойтись без попытки, нужно обойтись без попытки. Например при преобразовании строки в число можно написать
Попытка Возврат Число(стрЧисло); Исключение КонецПопытки; и ловить исключение каждый раз при возведенном флажке "Останавливаться на ошибке" или можно написать сложнее:
Возврат ТолькоЦифрыВСтроке() или Еще есть такой вариант ОписаниеТипа = Новый ОписаниеТипов(“Число”); Текчисло = ОписаниеТипа.ПривестиЗначение(ТекстовоеПоле);
но код не будет генерить ненужных исключений

Ответ5: любая ошибка бд внутри транзакции рвет эту транзакцию, поэтому внутри транзакции можно не пытаться ловить ошибки, если не предусмотрен полный выход из транзакции
Если есть подозрения, что код может работать некорректно, то нужно сделать все, чтобы устранить эту неопределенность, а не совать его в попытку, чтоб разбирались другие программисты. За код типа
Попытка СделатьЧтото(); Исключение КонецПопытки;
будут отстреливаться лишние органы. В блоке исключение ВСЕГДА должен быть код по отработке, иначе потом нереально найти что рвет транзакцию

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

От себя: не пытайтесь построить логику кода на условных переходах вида Попытка Если НЕ <проверка> Тогда ВызватьИсключение ... - это излишне запутывает и усложняет чтение кода другими программистами.
Вместо этого лучше провести предварительный рефакторинг, используя приёмы:
- Replace Nested Conditional with Guard Clauses, известный так же как ранний возврат из функции - расположив финальную операцию в самом конце
- Remove Logic for Controlling the Iteration, или "Вынос контролирующей логики из цикла" - отфильтровывая ненужные элементы коллекции (в запросе или в функции) _перед_ циклом заранее
- Extract into a function, так же известный как "Извлечение метода" - извлекая условный код в методы с говорящими именами

А почему заявление
«Попытка - Исключение» не оказывает хоть сколь-нибудь заметного влияния на скорость выполнения
не соответствует действительности - уже ответили в (3)
qwinter; itmind; ixijixi; +3 1 Ответить
23. tormozit 7229 05.03.24 15:08 Сейчас в теме
(22)
Попытка - это транзакция

Глубокое заблуждение.
30. qwinter 683 22.03.24 10:17 Сейчас в теме
(23) Попытка это транзакция, по определению самого термина транзакция. От того что в 1с есть отдельный функционал транзакций, другие транзакции не перестают быть транзакциями.
31. tormozit 7229 22.03.24 13:53 Сейчас в теме
(30) Поделись с нами определением
32. qwinter 683 22.03.24 14:16 Сейчас в теме
(31) Транзакция — группа логически объединённых последовательных операций по работе с данными, обрабатываемая или отменяемая целиком.
39. gybson 05.07.24 04:57 Сейчас в теме
(32) Но ведь нет методов "ПодтвердитьПопытку" и "ОтменитьПопытку"
37. tormozit 7229 09.06.24 11:56 Сейчас в теме
(22)
не соответствует действительности

Еще одно глубокое заблуждение. Утверждение автора
Конструкция «Попытка - Исключение» не оказывает хоть сколь-нибудь заметного влияния на скорость выполнения вашего кода, в случае, когда все работает штатно и исключение не было вызвано

соответствует действительности. И в то же время (3) верно.
24. kuzyara 2090 05.03.24 15:11 Сейчас в теме
(23) здесь имеется ввиду "как транзакция", приводится аналогия то есть. И далее объясняется в чем схожесть.
26. DrAku1a 1745 09.03.24 14:00 Сейчас в теме
Лично моё мнение - излишне частое использование "попытка-исключение" - это самый ленивый способ написания кода. Типа "Зачем продумывать, зачем тестировать код? Оберну-ка я его в Попытка-Исключение".

Ещё это может создавать видимость стабильной работы приложения (если просто скрывать все ошибки), но взамен - не будет оперативной обратной связи при возникновении нештатных ситуаций. Иными словами, пользователь не скажет, и в журнале не будет записано, что имела место исключительная ситуация. И как в этом случае быстро "въехать" в ситуацию, когда почему-то у пользователя программа работает "как-то не так"?!

Хотя идея "не пугать пользователя вываливанием ошибок" - здравая, но тогда нужно мониторить ошибки и вести учет всех таких ситуаций. Но это уже немного другая история))
27. Tavalik 3409 11.03.24 09:52 Сейчас в теме
Моя статья хорошая.


И правда хорошая. Спасибо.
Присоединюсь к коллегам, которые хотели бы увидеть накладные расходы при возникновении ошибки.
28. пользователь 13.03.24 15:46
Сообщение было скрыто модератором.
...
29. mixsture 13.03.24 16:52 Сейчас в теме
Я еще добавлю, что механизм исключений идеологически подменяет собой конструкции возврата значений из функции. Т.е. это тоже некоторая выходная информация, но как правило она крайне слабо типизована и может нести очень мало полезной нагрузки (видимо, в 8.3.21 полезную нагрузку таки добавили).

Вторая большая проблема исключений - это их размазанность по коду функции, которая вместе с предыдущим "слабо типизована" принуждает просматривать весь код функции. Тогда как обычный механизм возврата значений структурирован лучше, логичнее и распознается быстрее. Кроме того, в стандартах разработки есть возможность описать сигнатуру функции в комментарии перед ней - и тут отлично описываются параметры и возвращаемые значения, но совсем не описываются исключений. Так что в самом хорошем случае мы имеем сравнение времени на чтение сигнатуры vs полный анализ кода функции. Т.е. мы сильно теряем в читаемости кода.

Отсюда, некоторое количество крупных компаний вообще отказывается от механики исключений, переходя полностью на возврат значения с какими-нибудь кодами ошибок.
33. jan27 733 25.03.24 08:10 Сейчас в теме
С применением управляемых блокировок не обойтись без попытки
Управляемая блокировка ставится при начале транзакции, а фиксация или отмена должна быть в попытке.
34. CheBurator 2712 26.03.24 01:25 Сейчас в теме
(33)
Управляемая блокировка ставится при начале транзакции

установка управляемой блокировки - всегда успешно?
35. jan27 733 29.03.24 17:14 Сейчас в теме
(34) я это где-то утверждал?
36. CheBurator 2712 29.03.24 17:52 Сейчас в теме
(35) я ж не спрашиваю утверждаи/неутверждали..
Установка блокировки - внутри транзакции?
Если внутри транзакции и блокировка неуспешная - как ее обрабатывать?
Оставьте свое сообщение