Имя: Пароль:
1C
1C 7.7
v7: Вопрос, поражающий новизной... Вложенность попыток
0 Злопчинский
 
16.05.18
04:24
(Просьба не обсуждать - кузяво или не кузяво использовать Попытку, это вопрос для отдельного обсуждения)

Рассуждение#1 ========================================================

Цикл#1
-------------------
Пока 1=1 Цикл
   Попытка А=2; Продолжить;
   Исключение КонецПопытки;
КонецЦикла;

Цикл#2
-------------------
Пока 1=1 Цикл
   Попытка А=2;
   Исключение КонецПопытки;
КонецЦикла;

Очевидно (?), что Цикл#2 можно представить как последовательные независимые Попытки:

Попытка Исключение КонецПопытки;
Попытка Исключение КонецПопытки;
Попытка Исключение КонецПопытки;
Попытка Исключение КонецПопытки;
Попытка Исключение КонецПопытки;
...

Вопрос#1

Эквивалентен ли по исполнению Цикл#1 Циклу#2, т.е. можно ли Цикл#1 представить тоже как и Цикл #2:
(1.1)
Попытка Исключение КонецПопытки;
Попытка Исключение КонецПопытки;
Попытка Исключение КонецПопытки;
Попытка Исключение КонецПопытки;
Попытка Исключение КонецПопытки;
...

или как
(1.2)
Попытка Попытка Попытка.... Исключение КонецПопытки; Исключение КонецПопытки; Исключение КонецПопытки;

или как
(1.3)
Попытка Попытка Попытка.... Исключение Исключение КонецПопытки; КонецПопытки; КонецПопытки;

(1.4)
Есть ли разница какой вариант цикла использовать - Цикл#1 или Цикл#2 ...?

Рассуждение#2 ========================================================
Проистекает (?) из первого

Возврат#1
Попытка
  ...
  Возврат;
Исключение
КонецПопытки;

Возврат#2
Попытка
  ....;
  ф=1;
Исключение
  ф=0;
КонецПопытки;
Если Ф=1 Тогда Возврат; КонецЕсли;

Вопрос #2
(2.1)
Эквивалентны ли эти два возврата или в первом случае, операторы, на которые передастся исполнение после "Возврат" - будут они исполняться "внутри" попытки или "вне"..?
(2.2)
Есть ли разница какой вариант возврата использовать - Возврат#1 или Возврат#2 ...?
1 ADirks
 
16.05.18
08:36
(0) Ничего плохого в использовании исключений не вижу.

#1 и #2  эквивалентны, и это именно последовательность блоков Попытка, как показано в 1.1

Варианты с возвратом функционально эквивалентны, только во втором чуть больше затрат.
2 Сияющий в темноте
 
16.05.18
09:32
Вложенность попыток,это когда одна в другой и мы с помощью throw отправляем исключение верхней попытке
3 uno-group
 
16.05.18
11:56
Из моей практики Если вложеная попытка попадает в исключение то и вышестоящая отправляется туда же.
4 1Сергей
 
16.05.18
11:59
Процедура Рекурсия()
    Попытка
        Рекурсия();
    Исключение
    
    КонецПопытки;
КонецПроцедуры
5 1Сергей
 
16.05.18
11:59
(3) +1
6 Chieftain
 
16.05.18
12:11
(3) с чего это вдруг?
Попытка
    Попытка
        зн=1/0;
    Исключение
        Сообщить("Попытка вложенная:"+ОписаниеОшибки());
    КонецПопытки;
    Сообщить("Попытка основная после вложенной");
Исключение
    Сообщить("Попытка основная:"+ОписаниеОшибки());
КонецПопытки;


Выведет:
  Попытка вложенная:Деление на 0
  Попытка основная после вложенной

Т.е. вышестоящая вполне себе отдельно
7 uno-group
 
16.05.18
13:09
(6) Возможно зависит от вида ошибок и конструкции. Я документы в попытке проводил и там СтатусВозврата(0) был.
8 Chieftain
 
16.05.18
16:20
(7) Не принципиально. А со статусом возврата еще и возврат наверняка был.
9 Злопчинский
 
16.05.18
16:41
(1) Спсб!

"Ничего плохого в использовании исключений не вижу."
- я - тоже.
тем более что на 77 эксклюзивные блокировки на чтение без Попыток (+еще бубнышаманы) - не сделаешь
10 Злопчинский
 
16.05.18
16:44
(1) Значит в Рассуждении#2 использовать Возврат#1 - это нормально? - исполняемый код после возврата будет выполняться ВНЕ попытки..? - так?
11 Сияющий в темноте
 
16.05.18
17:32
(6) а где вызвать исключение?исключение из одной попытки в другую передается специальной командой
12 Злопчинский
 
16.05.18
17:59
(11) не в другую, а в верхнюю.
и не хватает чтобы внутри попытки вызвать текущее исключение
13 Злопчинский
 
16.05.18
17:59
и не хватает чтобы внутри попытки вызвать текущее исключение
- в смысле в языке возможности не хватает
14 Chieftain
 
16.05.18
19:49
(13) Читай СП:
ВызватьИсключение;
Raise;
Синтаксис:
ВызватьИсключение;
Назначение:
Данный оператор применяется в языковой конструкции Попытка-Исключение-КонецПопытки. Обработки исключительной ситуации могут быть вложенными. При этом, при возникновении исключительной ситуации управлениие будет передано на самый ''внутренний'' обработчик, начинающийся с ключевого слова Исключение. Последовательность операторов обработки исключительной ситуации может содержать оператор ВызватьИсключение. Выполнение данного оператора прекращает выполнение последовательности обработки исключительной ситуации и производится поиск более ''внешнего'' обработчика. Если таковой есть, то управление передается на его первый оператор. Если нет, то выполнение модуля прекращается с выдачей сообщения о первоначально возникшей ошибке. Оператор ВызватьИсключение может встречаться только внутри операторных скобок Исключение ... КонецПопытки.
Параметры:
Нет.
15 Duke1C
 
16.05.18
20:11
(13) "Всё уже украдено до вас" :) -> (14)
16 Злопчинский
 
16.05.18
21:53
(14) "Последовательность операторов обработки исключительной ситуации может содержать оператор ВызватьИсключение. "
- учите матчасть ;-)
ВызватьИсключение - ВНУТРИ обработки исключительной ситуации,
т.е.

Попытка
//чтото
Исключение
  ВызватьИсключение;
КонецПопытки

а мну хочется
Попытка
  //вот здесь как-то искуственно вызвать исключение
Исключение
  //чтобы попасть вот сюда
КонецПопытки
17 Chieftain
 
16.05.18
22:39
(16) Достаточно просто:
Модуль=СоздатьОбъект("ВыполняемыйМодуль");
Модуль.СформироватьОшибку("СлучилосьСтрашное");
18 ADirks
 
17.05.18
07:43
(10) да, всё так

(16) можно так
Попытка
   а = 1 / 0; //случилось страшное
Исключение
КонецПопытки
19 catena
 
17.05.18
07:56
(16)А в 77 такое не работает? В 8 использую активно.

Попытка
    ВызватьИсключение("Идем в исключение");
Исключение
    Сообщить(ОписаниеОшибки());
КонецПопытки;
20 catena
 
17.05.18
07:56
Да, прочитала

"Оператор ВызватьИсключение может встречаться только внутри операторных скобок Исключение ... КонецПопытки. "

Грустно.
21 Chieftain
 
17.05.18
13:02
(20) Чтобы грустно не было в 77 умные дяди придумали 1С++, FormEx и прочие радости семерочника.
22 Злопчинский
 
17.05.18
19:08
(18) какой умный, однако!
я тоже так знаю - но эта хрень в табло выкидывает сообщение, а оно нафиг не нужно, а морочиться с подавлением сообщений - муторно
23 Злопчинский
 
17.05.18
19:08
(17) так вот оно как!!!
24 Mr_Rm
 
17.05.18
20:31
(22) вроде бы нет никаких лишних сообщений:
Попытка
   ч=1/0;
Исключение
   // тут делаем что нужно
   // если табло закрыто, оно даже не появляется
КонецПопытки;
25 Злопчинский
 
17.05.18
20:53
(24) действительно.
значит я туплю.
26 Сияющий в темноте
 
17.05.18
20:58
Деление на ноль-наше все!
27 Chieftain
 
17.05.18
22:42
(26) Только в ОписаниеОшибки() будет "Деление на 0", а если как в (17) - можно что угодно написать.
Но это если анализ ошибки нужен
28 MWWRuza
 
гуру
17.05.18
22:53
(17)Это в 7.7 - ???
Странно, а СП об этом ничего не знает... Недокументированная фича, что-ли, или это в какой-то ВК доступно?
29 Злопчинский
 
17.05.18
22:58
(28) 1С++
30 Chieftain
 
18.05.18
02:15
(28) а у меня особенный СП ;)
в него добавлено http://www.1cpp.ru/docum/1C++.als
31 Mr_Rm
 
18.05.18
09:27
(27) можно передать в ОписаниеОшибки строку, например, так:

Попытка
   СоздатьОбъект("Строка для передачи в исключение");
Исключение
   строка=ОписаниеОшибки();
   // здесь строка == "Неудачная попытка создания объекта (Строка для передачи в исключение)"
КонецПопытки;
32 Злопчинский
 
18.05.18
12:36
(31) оверлевел ;-)
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн