08 / 12
Hata yönetimi
Beklenen hatalar, error.tsx ve retry, catchError ve notFound.
İki Tür Hata
Next.js hataları ikiye ayırır ve ikisini farklı ele alır:1
| Tür | Örnek | Nasıl ele alınır |
|---|---|---|
| Beklenen hata | Geçersiz kupon, stokta yok, bulunamayan ürün | Değer olarak döndürün ya da notFound() çağırın |
| Beklenmeyen hata | Veritabanı çöktü, koddaki bir bug | throw edin; hata sınırı yakalasın |
Beklenen Hatalar: Değer Döndürün
Server Action'da doğrulama hatası için throw etmeyin; useActionState'e bir mesaj döndürün. Doküman bu durumda try/catch ve throw yerine hatayı dönüş değeri olarak modellemeyi önerir.1 Örneği Server Actions dersinde gördünüz.
Server Component'te de aynı mantık geçerli: yanıt başarısızsa bir mesaj render edin.
async function Reviews({ slug }: { slug: string }) {
const res = await fetch(`https://api.example.com/reviews/${slug}`);
if (!res.ok) return <p>Yorumlar şu an yüklenemiyor.</p>;
const reviews: Review[] = await res.json();
return <ReviewList reviews={reviews} />;
}Bulunamadı: notFound
Olmayan bir ürüne gelindiğinde notFound() çağırın. En yakın not-found.tsx gösterilir.1 ProductDetails, Navigasyon ve prefetch dersindeki gibi sayfanın <Suspense>'i içinde render ediliyor.
// app/products/[slug]/page.tsx
import { notFound } from "next/navigation";
async function ProductDetails({ params }: Pick<PageProps<"/products/[slug]">, "params">) {
const { slug } = await params;
const product = await getProduct(slug);
if (!product) notFound();
return <h1>{product.name}</h1>;
}// app/products/[slug]/not-found.tsx
import Link from "next/link";
export default function ProductNotFound() {
return (
<>
<h1>Ürün bulunamadı</h1>
<Link href="/products">Tüm ürünler</Link>
</>
);
}Tip
Sayfa akmaya başladıysa sunucu 200 durum koduna bağlanmıştır; sonradan çağrılan notFound() bunu 404'e çeviremez. Next.js bu durumda sayfaya <meta name="robots" content="noindex"> ekler, arama motoru sayfayı dizine almaz. Aynı şekilde akış sırasında redirect() bir HTTP yönlendirmesi değil istemci tarafı yönlendirme olur.2 Bu rehberin proje uygulamasında /products/nope tam olarak böyle davrandı.
Warning
notFound() ve redirect() içeride bir hata fırlatarak çalışır. Onları bir try bloğunun içinde çağırırsanız catch yakalar ve çalışmazlar. try/catch dışında çağırın.3
Beklenmeyen Hatalar: error.tsx
Bir segmente error.tsx eklemek, o segmenti bir Error Boundary ile sarar. Hata en yakın üst sınıra kadar çıkar; böylece hatayı sayfanın bir bölümüyle sınırlayabilirsiniz. Error Boundary'ler Client Component olmalıdır.4
// app/products/error.tsx
"use client";
import { useEffect } from "react";
export default function ProductsError({
error,
retry,
}: {
error: unknown;
retry: () => void;
}) {
useEffect(() => {
console.error(error); // hata izleme servisine gönderin
}, [error]);
return (
<>
<h2>Ürünler yüklenemedi.</h2>
<button onClick={() => retry()}>Tekrar dene</button>
</>
);
}Üç ayrıntı:4
retry(), segmentin verisini yeniden çekip tekrar render eder. 16.3'te kararlı hâle geldi. Eski örneklerdekireset()yalnızca hata durumunu temizler, veriyi tekrar çekmez.errortipiunknown'dır.messageokumadan önceinstanceof Errorile daraltın.Production'da Server Component hataları genel bir mesajla gelir; ayrıntı sızmasın diye.
error.digest, sunucu loglarındaki kaydı bulmanızı sağlar.
Kök layout'taki hataları yakalamak için app/global-error.tsx var. Kök layout'un yerini aldığı için kendi <html> ve <body> etiketlerini yazar.1
Component Seviyesinde: catchError
Bir sayfadaki tek bir bölümü (öneriler, yorumlar) korumak için dosya kuralı yerine catchError kullanabilirsiniz. 16.3'te kararlı hâle geldi.5
// components/section-boundary.tsx
"use client";
import { catchError, type ErrorInfo } from "next/error";
function SectionError(props: { title: string }, { retry }: ErrorInfo) {
return (
<div role="alert">
<p>{props.title} yüklenemedi.</p>
<button onClick={() => retry()}>Tekrar dene</button>
</div>
);
}
export default catchError(SectionError);<SectionBoundary title="Öneriler">
<Recommendations />
</SectionBoundary>Kendi Error Boundary class'ınızdan farkı: redirect() ve notFound()'u yanlışlıkla yakalamaz, retry() ile veriyi yeniden çeker ve başka bir sayfaya geçince hata durumu kendiliğinden temizlenir.5
Hata Sınırının Yakalamadıkları
Error Boundary'ler render sırasındaki hataları yakalar. Bir onClick içindeki hata yakalanmaz; onu try/catch ile yakalayıp state'te tutun. startTransition içinde fırlatılan hata ise en yakın sınıra gider.1 Canlı ortamda hataları toplamak Production'a Hazırlık rehberinin konusu.
Kendin Dene
getProducts'ın içinethrow new Error("db down")yazın.error.tsxgörünüyor mu? Header yerinde duruyor mu?Hatayı yalnızca ilk çağrıda fırlatacak şekilde değiştirin ve Tekrar dene'ye basın.
next build && next startile çalıştırıperrornesnesinin mesajına bakın. Geliştirmedekiyle aynı mı?notFound()'u birtrybloğuna alın. Ne oluyor?
Detaylı Öğrenmek İçin
Resmi doküman: "Error Handling" sayfası; beklenen ve beklenmeyen hatalar, iç içe sınırlar ve
global-error.1Resmi doküman:
error.jsreferansı;retryileresetfarkı ve özel hata sınırı örneği.4Resmi doküman: React'in Error Boundary anlatımı; sınırın yakaladığı ve yakalamadığı hatalar.6
Kaynaklar
Beklenen hatalar, `notFound`, iç içe `error.js`, `catchError`, event handler hataları ve `global-error`.
Akış başladıktan sonra `notFound()` ve `redirect()` davranışı, `noindex` meta etiketi.
`redirect`'in hata fırlatarak çalışması ve `try` bloğu dışında çağrılması.
`error`, `error.digest`, `retry` ve `reset` prop'ları, production'daki genel mesaj ve sürüm geçmişi.
Component seviyesinde hata sınırı, `retry` ve framework hatalarıyla uyum.
Error Boundary'nin çalışma şekli ve sınırları.
Last updated: October 21, 2026
