You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何GenServer捕获:kill退出却无法捕获自定义原因的退出?

问题描述

编辑:我完全错了……这个GenServer示例没有意义,因为实际代码更复杂(一个启动其他GenServer并运行任务的GenServer),结果是我退出了错误的进程,还混淆了日志。抱歉。

我有一个开启退出捕获的GenServer。当我调用Process.exit(pid, :kill)时,handle_info回调会被触发,但如果使用其他退出原因,该回调从未被触发。

简化后的GenServer代码

defmodule Example do
  use GenServer

  def start(args, opts \\ []) do
    GenServer.start(__MODULE__, args, opts)
  end

  def init({task, meta}) do
    Process.flag(:trap_exit, true)
  end

  def kill do
    Process.exit(self, :not_kill_reason)
  end

  def handle_info({:EXIT, pid, reason}, state) do
    IO.puts("handle_info, reason: #{reason}")
    {:stop, :normal, nil}
  end
end

文档相关说明

根据Elixir官方文档:

如果进程开启了退出捕获,退出信号会被转换成{:EXIT, from, reason}消息并发送到该进程的消息队列。

如果退出原因是原子:kill,也就是调用Process.exit(pid, :kill)时,会向目标进程发送一个不可捕获的退出信号,进程会无条件以:killed原因退出。

结果……我居然搞反了,:kill能触发handle_info,但:not_kill_reason却不行:/


内容的提问来源于stack exchange,提问作者addUsername

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 16:32:08