处理任务中引发的异常

时间:2019-09-30 12:37:11

标签: elixir

我有一些要在任务中运行的代码,但可能会引发错误。我尝试用try / rescue包装,但是没有发现错误。

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 个答案:

答案 0 :(得分:3)

Task作为一个单独的过程启动。两个进程的相互通信只能交换消息。不能指望rescue在一个进程中发生的任何事情都与另一进程发生了什么事情-进程是孤立的

一个人可能rescue在被调用者进程(任务本身)内部,或者只是以:transient的身份启动任务并检查结果,但这是对OTP已经提供的功能的重新尝试。

查看文档中的linking一章。

如果您只想在偶尔出现异常时重试,启动受监督的任务,然后让它引发并崩溃,那么OTP会处理所有其他事情,包括重新启动等。

如果您需要尝试一次并以某种方式对引发的异常做出反应,则可能应该重新考虑体系结构并开始受监视的过程,从而捕获出口。