Phoenix bang operation, handle it best practice

I define a show.ex liveview route where I fetch a comic. This comic might be deleted a few seconds ago. Using the browser back navigation brings me with a few clicks to a Ecto.NoResultsError.

Currently I handle this in this manner, but somehow it feels not like the best approach.
Would a different approach be better / cleaner?

I am thinking of letting the NoResultsError bubble up to a Supervisor which knows of the routing hierarchy and redirects to /comics based on where the error was thrown. I am new to Elixir on this level so unsure if the Supervisor idea makes any sense.

Trying to learn best practices though…

  def mount(%{"id" => id}, _session, socket) do
    try do
      comic = Catalog.get_comic!(id)
      socket = assign(socket, :comic, comic)
      {:ok, socket}
    rescue
      Ecto.NoResultsError ->
        dbg("Comic not found")

        {:ok,
         socket
         |> put_flash(:error, "Comic not found.")
         |> redirect(to: ~p"/comics")}
    end
  end

The bang operation is autogenerated by Phoenix generators, which is why I don’t question that approach ATM.

That error page is active only in development though. If you disable it (default for prod) you’ll be served the 404 page of MyAppWeb.ErrorView/MyAppWeb.ErrorHTML. Serving 404s is imo the appropriate response for that case.

A redirect can be done as well, but I wouldn’t go that route unless there’s a good reason for it over a 404 page.

Allright, showing the 404 page is indeed perfect in this situation. Thanks for clearing that out!

Is my idea of a Supervisor catching the error somehow valid?

I wouldn’t say it’s invalid, but I’d say it’s not needed. Phoenix includes all the necessary tools to handle that case without you needing additional processes or supervisors and such.

2 Likes