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.
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.