Обработка исключений и получение результата из фона
На предыдущем этапе мы научились запускать фоновые задания и настраивать ожидание их завершения. Однако запуск — это только половина дела. В реальной разработке фоновое задание может завершиться аварийно или вернуть данные, которые нужно обработать в основном сеансе.
Поскольку фоновое задание выполняется в отдельном сеансе на сервере, оно не имеет прямого доступа к переменным или экранным формам пользователя. Для обмена информацией между «фоном» и основным сеансом мы используем специальные механизмы БСП.
Обработка исключений в фоновом режиме
В обычном режиме ошибка останавливает работу и выводит окно с предупреждением. В фоновом задании всё иначе: если произойдет критическая ошибка (деление на ноль, обращение к несуществующему объекту), фоновый поток просто прервется. Если не предусмотрена Обработка исключений, пользователь увидит лишь сообщение «Задание завершилось с ошибкой», не понимая причин.
Чтобы программа работала корректно, оборачивайте основной код фонового задания в конструкцию Try ... Except.
Пример организации кода в экспортной процедуре серверного модуля:
// Процедура в общем модуле (сервер)
Procedure CalculateDataInBackground(Parameters, ResultAddress) Export
Try
// Логика длительной операции
Result = 100 / Parameters.Divisor;
// Помещаем результат во временное хранилище
PutToTempStorage(Result, ResultAddress);
Except
// Записываем подробности ошибки для администратора
WriteErrorToLog(ErrorInfo());
// Перебрасываем исключение дальше, чтобы БСП зафиксировала статус "Ошибка"
Raise;
EndTry
EndProcedureЖурнал регистрации как инструмент диагностики
При выполнении кода на сервере нельзя использовать привычную отладку без специальных настроек. В этой ситуации основным источником информации становится Журнал регистрации.
БСП автоматически фиксирует запуск и завершение заданий. Чтобы понимать контекст ошибки, записывайте детали самостоятельно. Хорошим тоном считается запись структуры, содержащей имя подсистемы и контекст выполнения.
Как показано в Схеме 1, путь информации об ошибке выглядит как эстафета от серверного потока к интерфейсу администратора.
Получение результата из фона
Когда задание успешно завершилось, вам нужно забрать Результат фонового задания. В БСП самый эффективный способ сделать это — использовать временное хранилище.
Алгоритм действий:
- Перед запуском сформируйте уникальный адрес во временном хранилище.
- Передайте этот адрес в параметры фонового задания.
- Внутри задания запишите данные по этому адресу через
PutToTempStorage. - В основном сеансе после завершения задания считайте данные.
Не пытайтесь передать результат через глобальную переменную или реквизит формы напрямую из фонового кода. Фоновое задание — это другой сеанс. Оно не видит ваши переменные, и данные будут потеряны.
Для получения данных используйте стандартные методы, которые мы рассматривали в теме запуска асинхронных процессов.
Практикум: Получение итогов расчета
Закрепим теорию на примере получения структуры данных из фонового процесса.
Задание: Реализуйте получение результата
- В процедуре фонового задания сформируйте структуру
ResultDataс полямиStatus(Истина) иValue(результат вычислений). - Используйте
PutToTempStorage(ResultData, ResultAddress)для сохранения. - В обработчике завершения (на клиенте) примените
GetFromTempStorage(ResultAddress)и выведите результат пользователю черезShowUserNotification.
Мы научились запускать тяжелые процессы, контролировать их состояние и возвращать данные в интерфейс. Это завершает блок работы с асинхронностью.
Теперь, когда вы умеете создавать надежный функционал, нужно разобраться, кто сможет им пользоваться. В следующей теме мы перейдем к управлению доступом и изучим модель прав БСП: профили и группы доступа.
Понравился урок?
Сохраните прогресс и получите персональный курс по любой теме — без форм и паролей
Продолжить в Telegram