【发布时间】:2016-04-27 15:22:10
【问题描述】:
我在我的应用程序中使用了一个库,它定期返回 {:ok, value} 或 {:error, error} 的元组。在我们假设可能存在错误(例如用户输入)的情况下,我们会明确处理这些情况。对于所有其他情况,我更愿意假设它们将得到妥善处理,如果没有,则通过重定向处理失败情况。
我开始尝试使用一个函数来解决这个问题:
def show(conn, %{"id" => id}) do
user = client.user_show(conn.assigns.endpoint, id) |> get_value(conn)
# rest of method omitted
end
def get_value({:ok, value}, _conn), do: value
def get_value({:error, value}, conn) do
conn
|> put_flash(:error, "Client error")
|> redirect(to: "/")
|> halt
end
这似乎是个好主意,但不幸的是,尽管停止了,但 conn 仍在继续。这是有道理的,因为代码路径没有拆分。
因此,似乎更好的解决方案是实现此函数以引发特定错误,然后尝试全局解决它。
很遗憾,我找不到在 Phoenix 的全局级别上处理错误的方法。我看到的唯一可能的选项是使用ErrorView,但我不想仅仅显示错误,我想根据错误进行适当的重定向。
我是否遗漏了什么或者这在凤凰城目前是不可能的?
【问题讨论】: