Имя: Пароль:
1C
1С v8
Обработка исключений в асинхронном коде
,
0 LenaAt
 
11.10.18
08:57
Обработчик оповещения некой асинхронной процедуры вызывает процедуру на клиенте, в которой генерируется исключительная ситуация. Как правильно поступить в этом случае чтобы уже в обработчике оповещения прекратился выполняться код, следующий за вызовом процедуры, в которой сгенерировалась исключительная ситуация?
1 Повелитель
 
11.10.18
09:09
(0) Попытка
    
Исключение
    Возврат;
    //Сообщить(ОписаниеОшибки());
КонецПопытки;
2 Остап Сулейманович
 
11.10.18
09:10
(0) Ну дык... Все потенциально опасные вызовы обрамлять Попытка-Исключение.
3 Мыш
 
11.10.18
09:10
(0) Возможно, <ИмяПроцедурыОбработкиОшибки>?

Новый ОписаниеОповещения(
<ИмяПроцедуры>,
<Модуль>,
<ДополнительныеПараметры>,
<ИмяПроцедурыОбработкиОшибки>,
<МодульОбработкиОшибки>)
4 Остап Сулейманович
 
11.10.18
09:13
(3) В случае ТС ошибка уже не в "здесь". В "здесь" все отработалось без ошибок и пошло в "ИмяПроцедуры". И вот уже там, в "ИмяПроцедуры" возникла ошибка.
5 Cool_Profi
 
11.10.18
09:18
(4) Как раз если в продолжении обработки возникла ошибка, управление отдаётся именно в процедуру обработки ошибки
6 LenaAt
 
11.10.18
09:31
(1,2) Я говорю про обработчик оповещения, там код, естественно, продолжит выполняться. Читайте, пожалуйста, внимательнее вопрос.
7 Cyberhawk
 
11.10.18
09:32
Давай пример, чтоб не приходилось тяму напрягать
8 LenaAt
 
11.10.18
09:34
(3) Опять же, исключительная ситуация возникает не при выполнении асинхронного вызова, и даже не в обработке оповещения, а в коде процедуры, вызванной из обработки оповещения. Там у меня присутствует конструкция Попытка - Исключение - КонецПопытки. Но далее исполнение кода продолжается в обработчике оповещения. Вот его и надо прервать.
9 Cool_Profi
 
11.10.18
09:36
Так вызывай исключение и лови его в обработке ошибки.
10 LenaAt
 
11.10.18
09:48
&НаКлиенте
Процедура Сформировать(Команда)
    КаталогНаДиске = Новый Файл("C:\Мой каталог\");
    ДополнительныеПараметры = Новый Структура("ПутьККаталогу", "C:\Мой каталог\");
    Оповещение = Новый ОписаниеОповещения("ЗавершениеПроверкиСуществованияКаталога", ЭтотОбъект, ДополнительныеПараметры);
    КаталогНаДиске.НачатьПроверкуСуществования(Оповещение);
КонецПроцедуры

&НаКлиенте
Процедура ЗавершениеПроверкиСуществованияКаталога(Существует, ДополнительныеПараметры) Экспорт
    Если НЕ Существует Тогда
        СоздаемКаталог = Истина;
    КонецЕсли;
    
    ЧтоТоСделатьДополнительно();
    
    траляляНеНадоВыполнять = 0;
КонецПроцедуры

&НаКлиенте
Процедура ЧтоТоСделатьДополнительно()
    Попытка
        НеопределенностьНольНаНоль = 0/0;
    Исключение
        Возврат;
    КонецПопытки;
КонецПроцедуры
11 LenaAt
 
11.10.18
09:50
Оператор траляляНеНадоВыполнять = 0; не должен выполняться
12 Cyberhawk
 
11.10.18
09:50
Процедуру замени на функцию с возвратом результата успех или не успех. После вызова этой функции анализируешь возвращенный результат и продолжаешь свой код только если успех
13 Cool_Profi
 
11.10.18
09:51
&НаКлиенте
Процедура ЧтоТоСделатьДополнительно()
    Попытка
        НеопределенностьНольНаНоль = 0/0;
    Исключение
        ВызватьИсключение;
        Возврат;
    КонецПопытки;
КонецПроцедуры

И разумеется, в оповещение добавить ещё пару параметров
14 Cyberhawk
 
11.10.18
09:51
Можно попробовать применить хак - начинать транзакцию до вызова процедуры, внутри которой обрабатывается исключение, и пытаться зафиксировать ее после вызова этой процедуы. Тогда возникшее исключение по идее не даст это сделать и так ты узнаешь, что оно там внутри было.
15 LenaAt
 
11.10.18
09:51
Понятно, что вместо процедуры можно использовать функцию, но может быть в асинхронном мире есть другое решение?
16 Cyberhawk
 
11.10.18
09:53
(13) Твой вариант меняет логику выполнения кода, ведь этой процедурой может пользоваться еще кто-нибудь и просто не ожидать, что там теперь внутри взводится исключение
17 Cyberhawk
 
11.10.18
09:54
Только не ясно, почему автор какую-то асинхронность и оповещения приплетает, если приведенная им ситуация к этому никак не относится
18 Cool_Profi
 
11.10.18
09:56
(16) Тут вообще логики нет, менять нечего ))
19 LenaAt
 
11.10.18
09:56
(14) Спасибо
20 Остап Сулейманович
 
11.10.18
09:57
&НаКлиенте
Процедура ЗавершениеПроверкиСуществованияКаталога(Существует, ДополнительныеПараметры) Экспорт
    Если НЕ Существует Тогда
        СоздаемКаталог = Истина;
    КонецЕсли;
    
    //  Вот здесь
    Попытка
      ЧтоТоСделатьДополнительно();
    Исключение
      Возврат;
      //Или что там еще нужно....
    КонецПопытки;
    
    траляляНеНадоВыполнять = 0;
КонецПроцедуры

&НаКлиенте
Процедура ЧтоТоСделатьДополнительно()
   ...
   ВызватьИсключение("Сэмулирована ошибка внутри ЧтоТоСделатьДополнительно()");
КонецПроцедуры
21 LenaAt
 
11.10.18
11:18
(18)
„Каждого человека можно выслушать, но не с каждым стоит разговаривать.“ — Артур Шопенгауэр
22 Cool_Profi
 
11.10.18
11:21
(21) Ну тебя же мы выслушали...
23 Cyberhawk
 
11.10.18
11:41
Так что там, получилось что-нибудь?
24 LenaAt
 
11.10.18
12:56
Да, спасибо большое, все работает.
Ошибка? Это не ошибка, это системная функция.