Обработка исключения, возникшего в задаче - PullRequest
1 голос
/ 30 сентября 2019

У меня есть код, который я хотел бы выполнить в задаче, но он может выдать ошибку. Я попытался обернуть в попытку / спасение, однако ошибка не обнаружена.

try do
    Supervisor.start_link([ {Task, fn -> raise "kaboom" end}], strategy:  :one_for_one)
rescue
    RuntimeError -> "Error!"
end

Я надеялся на "Ошибка!"чтобы получить печать, однако я получаю -

(RuntimeError) kaboom
(stdlib) erl_eval.erl:678: :erl_eval.do_apply/6
(elixir) lib/task/supervised.ex:90: Task.Supervised.invoke_mfa/2
(stdlib) proc_lib.erl:249: :proc_lib.init_p_do_apply/3
Function: #Function<20.128620087/0 in :erl_eval.expr/5>
Args: []
{:ok, #PID<0.332.0>}

Есть ли способ обработки исключений, вызванных внутри задачи от ее инициатора?

Спасибо

1 Ответ

3 голосов
/ 01 октября 2019

Task запускается как отдельный процесс. Взаимодействие двух процессов может быть только обмен сообщениями. Нельзя ожидать, что rescue что-то произошло в одном процессе от другого процесса - процессы изолированы .

Можно rescue внутри процесса вызываемого (сама задача) или просто запуститьзадача как :transient и проверка результата, но это попытка заново изобрести функциональность, уже предоставленную OTP.

Проверьте , связав главу в документации.

Если все, что вам нужно, - это повторить попытку при возникновении случайного исключения, запустить задачу под наблюдением и разрешить ее выполнение и сбой, OTP позаботится обо всем остальном, включая перезапуск и т. Д.

Есливам нужно один раз попробовать и как-то отреагировать на возникшее исключение, вам, вероятно, следует пересмотреть архитектуру и вместо этого запустить отслеживаемый процесс, перехватывая выходы.

...