Mehmet

WFN Üye
Konular
1,851
Mesajlar
1,852
Çözüm
0
Ticaret Puanı
0
Üyelik
1 Ay 6 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi
React hata sınırı (Error Boundary), alt bileşen ağacında render sırasında, yaşam döngüsü metotlarında ve sınıf bileşenlerinin kurucularında oluşan JavaScript hatalarını yakalar. Yakalanan hata tüm arayüzü bozmak yerine, sınırın tanımladığı yedek ekranın gösterilmesini sağlar. Ancak olay işleyicilerindeki hataları, zamanlayıcı ve diğer asenkron kod hatalarını, sunucu tarafı render hatalarını veya hata sınırının kendi hatalarını otomatik olarak yakalamaz. Güncel React’te useTransition’ın döndürdüğü startTransition işlevi içinde atılan hataların sınır tarafından yakalanabildiği özel durumu, sıradan zamanlayıcı/Promise davranışıyla karıştırmayın.

Hangi hatalar yakalanır?​


Bir hata sınırının alt ağacında şu durumlar yakalanabilir:

  • Bir fonksiyon bileşeninin JSX üretirken veya render sırasında hata vermesi.
  • Bir sınıf bileşeninin render, constructor veya yaşam döngüsü metotlarında hata oluşması.
  • Alt bileşenlerden birinin geçersiz veri nedeniyle render edilememesi.

Hata sınırı hatayı kendi alt ağacında yakalar; üst seviyedeki veya hata sınırının dışındaki bileşenleri korumaz. Sınırın kendisi hata verirse, hatayı yakalayacak başka bir üst sınır gerekir.

Yakalanmayan durumlar​


Aşağıdaki hatalar Error Boundary tarafından otomatik olarak yakalanmaz:

  • Butona tıklama gibi olay işleyicilerinde oluşan hatalar. Bunlarda try...catch veya uygun hata durumu kullanılmalıdır.
  • setTimeout, Promise ve diğer asenkron işlemlerde sonradan oluşan hatalar.
  • Sunucu tarafında render edilirken oluşan hatalar.
  • Hata sınırının kendi kodundaki hatalar.

Örneğin bir tıklama sırasında API isteği başarısız olursa hata sınırının devreye girmesini beklemeyin. İstek hatasını catch içinde ele alıp kullanıcıya yüklenemedi, yeniden dene veya benzeri bir durum göstermelisiniz.

En küçük çalışan hata sınırı örneği​


React'te yerleşik hata sınırı sınıf bileşeniyle oluşturulur. Aşağıdaki örnekte ProblemliBilesen render sırasında hata verir ve sınır yedek ekranı gösterir:

Kod:
import React from "react";

class HataSiniri extends React.Component {
  state = { hata: null };

  static getDerivedStateFromError(hata) {
    return { hata };
  }

  componentDidCatch(hata, bilgi) {
    console.error("React alt ağaç hatası:", hata, bilgi);
  }

  render() {
    if (this.state.hata) {
      return <p>Bu bölüm şu anda görüntülenemiyor.</p>;
    }

    return this.props.children;
  }
}

function ProblemliBilesen() {
  throw new Error("Örnek render hatası");
}

export default function Uygulama() {
  return (
    <HataSiniri>
      <ProblemliBilesen />
    </HataSiniri>
  );
}

Örneği çalıştırma ve sonucu yorumlama​


  1. Bu kodu çalışan bir React uygulamasının giriş bileşenine yerleştirin ve uygulamayı geliştirme sunucusuyla çalıştırın.
  2. Sayfayı açtığınızda ProblemliBilesen hata fırlatacağı için beklenen görünür çıktı Bu bölüm şu anda görüntülenemiyor. olur.
  3. Geliştirici konsolunda hata ve bileşen yığını görülür. Bu kayıt, hatanın yok olduğu anlamına gelmez; yalnızca kullanıcıya gösterilecek alternatif ekranın üretildiği anlamına gelir.
  4. Yedek ekran görünmüyorsa önce ProblemliBilesen öğesinin gerçekten HataSiniri içinde olup olmadığını ve sınırın kendisinin hata verip vermediğini kontrol edin.

Fonksiyon bileşenleri doğrudan hata sınırı olamaz; bunun için sınıf tabanlı bir sınır yazabilir veya projede kullanılan, hata sınırı sağlayan bir çözümü tercih edebilirsiniz. Üretimde yedek ekranı, hatayı sessizce gizlemek yerine kayıt sistemine bildirip kullanıcının yeniden denemesine veya güvenli bir bölüme dönmesine imkân vermelidir.

Hata yeriBoundary beklentisiİlgili çözüm
Alt bileşenin render’ıUygun üst sınır yakalarFallback ve kontrollü kayıt
Normal click işleyicisiOtomatik yakalamazİşleyicide hata durumu/catch
Sıradan timer/asenkron callbackOtomatik yakalamazİşlemin kendi hata akışı
Boundary’nin kendi render’ıKendisi yakalayamazDaha üst sınır ve gerçek düzeltme

Geliştirme araçları fallback üretilse bile hata overlay’i gösterebilir; yalnız kırmızı geliştirme ekranı gördüğünüz için sınırın hiç çalışmadığını varsaymayın. Sıradan bir try bloğunda başlatılan ama await edilmeyen Promise’in sonraki reddi de o senkron catch’e otomatik düşmez.

Hata sınırını nereye yerleştirmeli?​


Tek bir sınırı uygulamanın tamamının çevresine koymak basit bir genel yedek ekran sağlar; fakat tüm sayfanın etkilenmesine yol açabilir. Büyük uygulamalarda sınırı sayfa, panel veya bağımsız widget çevresine yerleştirmek genellikle daha kullanışlıdır. Böylece yalnız bozulan bölüm yedek ekrana geçer ve diğer bölümler çalışmayı sürdürebilir.

Bir olay işleyicisini test etmek için hata sınırına güvenmeyin. Örneğin:

Kod:
function KaydetButonu() {
  function kaydet() {
    try {
      // Bu örnek senkron hatadır. Asenkron işlem için await/catch gerekir.
      throw new Error("Kaydetme başarısız");
    } catch (hata) {
      console.error(hata);
    }
  }

  return <button type="button" onClick={kaydet}>Kaydet</button>;
}

Bu ayrım önemlidir: hata sınırı render edilemeyen React alt ağacını izole eder; iş mantığı, ağ isteği ve kullanıcı etkileşimi hatalarının sorumluluğu ise ilgili kodda kalır.

Kaynaklar​



Sık sorulan sorular​


Hata sınırı yakalanan hatayı otomatik olarak düzeltir mi?​


Hayır. Hatanın ayrıntılarını kaydetmek ve yedek arayüz göstermek için kullanılır. Asıl düzeltme, hataya neden olan bileşen veya verinin düzeltilmesini gerektirir.

Bir hata sınırını sıfırlayıp bileşeni yeniden deneyebilir miyim?​


Evet. Sınırın hata durumunu temizleyen bir yeniden deneme akışı tasarlanabilir. Pratikte sınır, yeni bir key ile yeniden oluşturulabilir veya sınıf bileşeninde hata durumunu temizleyen bir düğme sağlanabilir; ancak aynı hata koşulu sürüyorsa yeniden deneme yine başarısız olur.

Hata sınırı form doğrulama hataları için uygun mudur?​


Genellikle hayır. Form doğrulama hataları beklenen kullanıcı durumlarıdır; alanların yanında normal durum yönetimiyle gösterilmelidir. Error Boundary, beklenmeyen render ve bileşen ağacı hataları içindir.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.