Study
Phoenix

Error Handling & Fallback Controller

Penjelasan

Ketika aksi controller mengembalikan sesuatu selain conn (misalnya {:error, changeset} dari context), Phoenix akan error kecuali kita mendaftarkan action_fallback di dalam controller yang menunjuk ke modul FallbackController. Modul ini berisi beberapa klausa call/2 (memakai use Phoenix.Controller, action_fallback) untuk menangani pola hasil error yang berbeda-beda secara terpusat. Pola ini membuat controller utama tetap bersih karena hanya fokus pada happy path, sementara error handling (misalnya mengubah changeset error menjadi response JSON 422, atau not found menjadi 404) diserahkan ke satu tempat yang konsisten dipakai di banyak controller API.

Contoh Konsep

defmodule TokoAppWeb.FallbackController do
  use TokoAppWeb, :controller

  def call(conn, {:error, %Ecto.Changeset{} = changeset}) do
    conn
    |> put_status(:unprocessable_entity)
    |> json(%{errors: changeset_errors(changeset)})
  end

  def call(conn, {:error, :not_found}) do
    conn
    |> put_status(:not_found)
    |> json(%{error: "Data tidak ditemukan"})
  end
end

defmodule TokoAppWeb.Api.ProdukController do
  use TokoAppWeb, :controller
  action_fallback TokoAppWeb.FallbackController

  def create(conn, params) do
    with {:ok, produk} <- TokoApp.Catalog.create_produk(params) do
      json(conn, produk)
    end
  end
end

Praktikum

Tambahkan action_fallback pada Api.ArtikelController agar create yang gagal (changeset error) otomatis ditangani FallbackController.

Editor Latihan

Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.

Tips

Gunakan konstruksi with di controller bersama action_fallback, ini pola idiomatis Elixir untuk merangkai beberapa operasi yang bisa gagal tanpa nested case.