Tüm blog yazıları

Async Fonksiyonlarda Hata Yönetimi: try...catch ile Güvenli Kod

Async fonksiyonlarda yakalanmayan hatalar uygulamanızı mı çökertiyor? Promise zincirlerindeki .catch()'in yerini dolduran try...catch bloğu ile await işlemlerinizi güvenle yönetin. Asenkron kodunuzu nasıl daha sağlam hale getireceğinizi öğrenin.

eminbasbayan3 dk okuma
Async Await Hata Yönetimi: try...catch ile Güvenli JS Kodu

Async Fonksiyonlarda Hata Yönetimi: try...catch ile Güvenli Kod

Giriş

async ve await sözdizimi harikadır, ancak bir sorun vardır: Promise zincirlerinde kullandığımız .catch() metodu burada doğrudan kullanılamaz. Eğer await ettiğiniz bir işlem hata verirse (Promise reject olursa), kodunuzun çalışması durur ve konsolda kırmızı bir hata görürsünüz. Bu makalede, bu hataları nasıl zarif bir şekilde yöneteceğimizi (handle edeceğimizi) öğreneceğiz.

Problem: Yakalanmayan Hatalar

Normalde Promise ile şöyle yapardık:

javascript
veriGetir()
    .then(data => console.log(data))
    .catch(hata => console.log("Hata:", hata)); // Hatayı yakaladık

Ancak async/await ile şunu yaparsak ve hata oluşursa:

javascript
async function veriAl() {
    const data = await veriGetir(); // Burada hata olursa kod KIRILIR!
    console.log(data); // Bu satır asla çalışmaz
}

veriAl();
// Uncaught Error: ...

Bu durum uygulamamızın çökmesine neden olabilir.

Çözüm: try...catch Bloğu

JavaScript'in standart hata yakalama mekanizması olan try...catch, asenkron fonksiyonlarda da mükemmel çalışır. await ifadesini try bloğu içine alırız.

javascript
async function guvenliVeriAl() {
    try {
        // Hata oluşabilecek kodları buraya yaz
        console.log("Veri isteniyor...");
        const data = await veriGetir();
        console.log("Veri geldi:", data);
        
    } catch (hata) {
        // Hata olursa burası çalışır
        console.log("BİR HATA OLUŞTU!");
        console.log("Hata detayı:", hata);
    }
}

Eğer veriGetir() başarılı olursa, try bloğu sonuna kadar çalışır ve catch atlanır. Eğer hata verirse, try bloğunun çalışması o anda durur ve kontrol catch bloğuna geçer.

Gerçek Hayat Örneği: Kullanıcı Girişi

javascript
const girisButonu = document.querySelector('#giris');
const hataKutusu = document.querySelector('#hata-kutusu');

girisButonu.addEventListener('click', async function() {
    hataKutusu.style.display = 'none'; // Önceki hataları temizle
    
    try {
        const kullaniciAdi = document.querySelector('#kadi').value;
        const sifre = document.querySelector('#sifre').value;
        
        // Hata fırlatabilecek asenkron işlem
        const sonuc = await girisYap(kullaniciAdi, sifre);
        
        console.log("Giriş başarılı, yönlendiriliyor...");
        window.location.href = '/dashboard';
        
    } catch (e) {
        // Hata yakalandı, kullanıcıya göster
        hataKutusu.textContent = "Giriş başarısız: " + e.message;
        hataKutusu.style.display = 'block';
    }
});

Hata Nesnesi (e)

catch(e) bloğundaki e (veya error, err) parametresi hatanın kendisidir. Bu, Promise'ın reject edildiği değerdir.

javascript
try {
    throw new Error("Bir şeyler ters gitti");
} catch (e) {
    console.log(e.name);    // "Error"
    console.log(e.message); // "Bir şeyler ters gitti"
    console.log(e.stack);   // Hatanın nerede olduğu (stack trace)
}

Alternatif Yaklaşım: Karma Kullanım

Bazen try...catch bloğu kodun akışını bozabilir veya çok "kalabalık" görünebilir. await edilen fonksiyona .catch() ekleyerek de devam edebilirsiniz.

javascript
async function veriAl() {
    // Hata olursa null döner, kod kırılmaz
    const data = await veriGetir().catch(e => {
        console.log("Basit hata yakalama:", e);
        return null; // Varsayılan değer
    });
    
    if (data) {
        console.log("Veri:", data);
    } else {
        console.log("Veri alınamadı, devam ediliyor...");
    }
}

Bu yöntem özellikle varsayılan değer (fallback value) atamak istediğinizde çok kullanışlıdır.

finally Bloğu

Hata olsa da olmasa da çalışmasını istediğiniz kodlar için finally kullanabilirsiniz (örneğin yükleniyor ikonunu kaldırmak için).

javascript
async function islemYap() {
    yukleniyorGoster(true);
    
    try {
        await uzunSurenIslem();
        basariMesaji();
        
    } catch (error) {
        hataMesaji(error);
        
    } finally {
        // Her durumda çalışır
        yukleniyorGoster(false); 
    }
}

Seri Özeti ve Kapanış

Tebrikler! Asenkron JavaScript serisinin sonuna geldiniz. Bu seride şunları öğrendik:

  1. Call Stack: JavaScript'in tek iş parçacıklı doğası
  2. Web APIs: Tarayıcının arka planda nasıl çalıştığı
  3. Callback Hell: Neden kaçınmamız gerektiği
  4. Promises: Asenkron işlemlerin modern yönetimi
  5. async/await: Asenkron kodu senkron gibi yazma sanatı
  6. Hata Yönetimi: Uygulamamızı try...catch ile güvenli hale getirme

Artık API istekleri yapan, veritabanı işlemleri yürüten ve kullanıcı etkileşimlerini yöneten modern, temiz ve güvenli JavaScript kodları yazmaya hazırsınız.

İyi kodlamalar!

JavaScript Classes ile pratik uygulamalar, metotlar arası iletişim ve gerçek dünya kod örnekleri
JavaScript Dersleri9 dk okuma

JavaScript Classes - Pratik Uygulamalar

JavaScript class'ları ile pratik uygulamalara geçin! Metotlar arası iletişimden constructor'da metot çağırmaya, kod tekrarını azaltmaktan gerçek dünya senaryolarına kadar class kullanımının inceliklerini keşfedin. Kendi alışveriş sepeti örneğinizle bilginizi pekiştirin.

Yazıyı oku
JavaScript class yapısını gösteren bir kod örneği, ES6 ile modern nesne oluşturma
JavaScript Dersleri9 dk okuma

JavaScript Classes

ES6 ile JavaScript'e gelen class yapısı sayesinde nesne oluşturmak artık çok daha kolay ve düzenli! Constructor function karmaşasından kurtulup, okunabilir ve yönetilebilir kodlar yazmak isteyenler için modern JavaScript'in temel taşı olan class'ları tüm detaylarıyla keşfedin. Bu rehberle nesne şabl

Yazıyı oku
JavaScript kodunda Constructor Function ve new keyword'ü ile nesne oluşturma örnekleri
JavaScript Dersleri8 dk okuma

Constructor Functions ve new Keyword

Factory Function'ların hafıza israfı sorununa Constructor Function'lar ve new keyword'ü ile son verin! Metotları paylaştırarak JavaScript objelerini daha verimli nasıl oluşturacağınızı, new'in perde arkasında neler yaptığını ve prototype sisteminin gücünü bu rehberde keşfedin.

Yazıyı oku

Çerez tercihlerin

Platformun çalışması için zorunlu çerezler kullanıyoruz. İzin verirsen anonim kullanım verilerini ölçüyoruz. Ayrıntıları incele