|
Обработка исключений в асинхронном коде | ☑ | ||
---|---|---|---|---|
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
|
Да, спасибо большое, все работает.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |