ViraStack
  • Akademi
  • Hakkında
  • Destek
Genel BakışKaynaklarKatkı
ViraStack

Frontend ekosistemi: ücretsiz rehberler, proje şablonları, AI kuralları ve form bileşenleri.

Ürünler

  • ViraStack Start
  • ViraStack AI
  • ViraStack Mask
  • ViraStack Password
  • ViraStack Guide

Keşfet

  • Akademi
  • Hakkında
  • Marka
  • Destek

© 2026 ViraStack.

Açık kaynak · MIT

Next.js

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ÖrnekNasıl ele alınır
Beklenen hataGeçersiz kupon, stokta yok, bulunamayan ürünDeğer olarak döndürün ya da notFound() çağırın
Beklenmeyen hataVeritabanı çöktü, koddaki bir bugthrow 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>
    </>
  );
}

İpucu

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

Uyarı

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 örneklerdeki reset() yalnızca hata durumunu temizler, veriyi tekrar çekmez.

  • error tipi unknown'dır. message okumadan önce instanceof Error ile 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çine throw new Error("db down") yazın. error.tsx gö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 start ile çalıştırıp error nesnesinin mesajına bakın. Geliştirmedekiyle aynı mı?

  • notFound()'u bir try bloğ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.1

  • Resmi doküman: error.js referansı; retry ile reset farkı ve özel hata sınırı örneği.4

  • Resmi doküman: React'in Error Boundary anlatımı; sınırın yakaladığı ve yakalamadığı hatalar.6

Kaynaklar

  • 1DokümanNext.js: Error Handling

    Beklenen hatalar, `notFound`, iç içe `error.js`, `catchError`, event handler hataları ve `global-error`.

  • 2DokümanNext.js: Streaming, Status codes

    Akış başladıktan sonra `notFound()` ve `redirect()` davranışı, `noindex` meta etiketi.

  • 3DokümanNext.js: redirect

    `redirect`'in hata fırlatarak çalışması ve `try` bloğu dışında çağrılması.

  • 4DokümanNext.js: error.js

    `error`, `error.digest`, `retry` ve `reset` prop'ları, production'daki genel mesaj ve sürüm geçmişi.

  • 5DokümanNext.js: catchError

    Component seviyesinde hata sınırı, `retry` ve framework hatalarıyla uyum.

  • 6DokümanReact: Catching rendering errors with an Error Boundary

    Error Boundary'nin çalışma şekli ve sınırları.

Bu sayfayı düzenle

Son güncelleme tarihi: 21 Ekim 2026

Önceki adım07. Navigasyon ve prefetchSonraki adım09. Route Handler ve proxy