Bvural41 1
Bvural41
mannaxxx 1
mannaxxx
Agora Metin2 1
Agora Metin2
Mt2Hizmet 1
Mt2Hizmet
berkmenoo 1
berkmenoo
kralhakan2009 1
kralhakan2009
Vahsi Uzman 1
Vahsi Uzman
Hikaye Ekle

[NODE JS] throw ile Özel Hata Fırlatma

Ayyıldız2 | 2008 TR Yapısı • 1-99 Orta Emek Destan • Oto Avsız • 10 Temmuz 21:00 HEMEN TIKLA!

nodejs.png


[NODE JS] throw ile Özel Hata Fırlatma​


Selam arkadaşlar. Bir önceki konuda hata yakalamayı öğrendik, şimdi kendi hatalarımızı nasıl oluşturur ve fırlatırız onu göreceğiz. throw ifadesi ile programın akışını kontrol etmek, doğrulama yapmak ve anlamlı hata mesajları vermek mümkün. Ben kendi projelerimde mutlaka özel hata sınıfları oluşturuyorum çünkü genel Error mesajları çoğu zaman yeterli olmuyor.

throw Kullanımı​


throw ifadesi herhangi bir değeri hata olarak fırlatabilir ama her zaman Error nesnesi veya onun alt sınıflarını kullanmanızı öneririm. String fırlatmak mümkün ama stack trace bilgisini kaybedersiniz ve hata yakalama mekanizması düzgün çalışmaz. Bu yaygın bir hata, yeni başlayanlar throw "bir hata oluştu" gibi string fırlatıyor.

Tecrübeme göre validation (doğrulama) fonksiyonlarında throw kullanmak en yaygın senaryodur. Fonksiyona gelen parametreleri kontrol eder, geçersizse anlamlı bir hata mesajı ile hata fırlatırsınız. Bu sayede fonksiyonun geri kalanı güvenli parametrelerle çalışır.

JavaScript:
// === THROW KULLANIMI ===

// Temel throw
function bolme(bolunen, bolen) {
    if (typeof bolunen !== 'number' || typeof bolen !== 'number') {
        throw new TypeError('Her iki parametre de sayı olmalıdır');
    }
    if (bolen === 0) {
        throw new RangeError('Sıfıra bölme yapılamaz');
    }
    return bolunen / bolen;
}

try {
    console.log(bolme(10, 2));      // 5
    console.log(bolme(10, 0));      // RangeError
} catch (hata) {
    console.error(`${hata.name}: ${hata.message}`);
}

try {
    console.log(bolme('on', 2));    // TypeError
} catch (hata) {
    console.error(`${hata.name}: ${hata.message}`);
}

// Validation fonksiyonu
function kullaniciDogrula(kullanici) {
    if (!kullanici) {
        throw new Error('Kullanıcı verisi gereklidir');
    }
    if (!kullanici.isim || kullanici.isim.trim().length === 0) {
        throw new Error('İsim alanı boş bırakılamaz');
    }
    if (!kullanici.email || !kullanici.email.includes('@')) {
        throw new Error('Geçerli bir email adresi giriniz');
    }
    if (!kullanici.yas || kullanici.yas < 18) {
        throw new Error('Kullanıcı 18 yaşından büyük olmalıdır');
    }
    if (kullanici.sifre && kullanici.sifre.length < 8) {
        throw new Error('Şifre en az 8 karakter olmalıdır');
    }
    return true;
}

const testKullanicilar = [
    null,
    { isim: '' },
    { isim: 'Ali', email: 'gecersiz' },
    { isim: 'Ali', email: 'ali@test.com', yas: 15 },
    { isim: 'Ali', email: 'ali@test.com', yas: 25, sifre: '123' },
    { isim: 'Ali', email: 'ali@test.com', yas: 25, sifre: '12345678' }
];

testKullanicilar.forEach((k, i) => {
    try {
        kullaniciDogrula(k);
        console.log(`Test ${i + 1}: GEÇTI`);
    } catch (hata) {
        console.log(`Test ${i + 1}: BAŞARISIZ - ${hata.message}`);
    }
});

Özel Hata Sınıfları​


JavaScript'in yerleşik hata sınıfları (Error, TypeError, RangeError vs.) bazen yeterli olmaz. Kendi hata sınıflarınızı oluşturarak hata türlerine göre farklı işlemler yapabilirsiniz. Örneğin bir API'de ValidationError, AuthenticationError, NotFoundError gibi özel sınıflar oluşturmak standart bir pratik.

Geçen çalıştığım bir projede özel hata sınıfları sayesinde error handler middleware çok temiz bir şekilde çalışıyordu. Her hata türüne göre farklı HTTP status kodu ve mesaj döndürüyordu. Bu yaklaşım büyük projelerde gerçekten hayat kurtarıyor.

JavaScript:
// === ÖZEL HATA SINIFLARI ===

// Temel özel hata
class UygulamaHatasi extends Error {
    constructor(mesaj, statusKodu = 500) {
        super(mesaj);
        this.name = 'UygulamaHatasi';
        this.statusKodu = statusKodu;
        this.tarih = new Date().toISOString();
    }
}

// Spesifik hata sınıfları
class DogrulamaHatasi extends UygulamaHatasi {
    constructor(mesaj, alan) {
        super(mesaj, 400);
        this.name = 'DogrulamaHatasi';
        this.alan = alan;
    }
}

class YetkilendirmeHatasi extends UygulamaHatasi {
    constructor(mesaj = 'Bu işlem için yetkiniz bulunmuyor') {
        super(mesaj, 403);
        this.name = 'YetkilendirmeHatasi';
    }
}

class BulunamadiHatasi extends UygulamaHatasi {
    constructor(kaynak = 'Kaynak') {
        super(`${kaynak} bulunamadı`, 404);
        this.name = 'BulunamadiHatasi';
        this.kaynak = kaynak;
    }
}

class CakismaHatasi extends UygulamaHatasi {
    constructor(mesaj = 'Bu kayıt zaten mevcut') {
        super(mesaj, 409);
        this.name = 'CakismaHatasi';
    }
}

// Kullanım örneği: basit bir kullanıcı servisi
const kullaniciDB = [
    { id: 1, isim: 'Ahmet', email: 'ahmet@test.com', rol: 'admin' },
    { id: 2, isim: 'Ayşe', email: 'ayse@test.com', rol: 'user' }
];

function kullaniciBul(id) {
    if (!id || typeof id !== 'number') {
        throw new DogrulamaHatasi('Geçerli bir ID giriniz', 'id');
    }

    const kullanici = kullaniciDB.find(k => k.id === id);
    if (!kullanici) {
        throw new BulunamadiHatasi('Kullanıcı');
    }

    return kullanici;
}

function kullaniciSil(id, istekYapan) {
    if (istekYapan.rol !== 'admin') {
        throw new YetkilendirmeHatasi();
    }

    const kullanici = kullaniciBul(id);
    console.log(`${kullanici.isim} silindi`);
    return true;
}

// Error handler (Express middleware tarzı)
function hataYonetici(hata) {
    const yanit = {
        basarili: false,
        hata: {
            tip: hata.name,
            mesaj: hata.message,
            statusKodu: hata.statusKodu || 500
        }
    };

    if (hata instanceof DogrulamaHatasi) {
        yanit.hata.alan = hata.alan;
    }

    if (hata.statusKodu >= 500) {
        console.error('KRİTİK HATA:', hata.stack);
    } else {
        console.warn(`İstemci hatası [${hata.statusKodu}]:`, hata.message);
    }

    return yanit;
}

// Test senaryoları
const testler = [
    () => kullaniciBul('abc'),
    () => kullaniciBul(99),
    () => kullaniciSil(1, { rol: 'user' }),
    () => kullaniciBul(1)
];

testler.forEach((test, i) => {
    try {
        const sonuc = test();
        console.log(`Test ${i + 1}: Başarılı -`, sonuc);
    } catch (hata) {
        console.log(`Test ${i + 1}:`, JSON.stringify(hataYonetici(hata)));
    }
});

Özel hata sınıfları oluşturmak profesyonel Node.js projelerinin temel taşıdır. Her projede en azından ValidationError, AuthError, NotFoundError oluşturmanızı öneririm. Bu hataları middleware ile yakalayıp uygun HTTP yanıtları döndürmek API geliştirmenin standart yoludur. Kolay gelsin.
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst