Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

Обработка исключений в асинхронном коде

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

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

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

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

    Попытка
      ЧтоТоСделатьДополнительно();
    Исключение
      Возврат;
      //Или что там еще нужно....

    КонецПопытки;
    
    траляляНеНадоВыполнять = 0;
КонецПроцедуры

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


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует