Promisler ve Async/Await ile Hata Yönetimi
Asenkron kodunuzu yazarken Promisler ve Async/Await kullanmak, hataları çok daha etkili bir şekilde yönetmenizi sağlar. Promisler, sonuçları "başarılı" ya da "hatalı" olarak sınıflandırarak hata yönetimini daha yapılandırılmış bir hale getirir. Örneğin, bir dosya okuma işlemi yaptığınızda, okuma başarılı olursa bir değer döner, aksi takdirde hata mesajı ile karşılaşırsınız.
```javascript
const fs = require('fs').promises;
fs.readFile('data.json', 'utf8')
.then(data => {
console.log('Dosya başarıyla okundu:', data);
})
.catch(err => {
console.error('Hata oluştu:', err);
});
```
Ancak Async/Await, Promisler ile daha uyumlu bir yazım tarzı sunar ve kodu daha okunabilir kılar. Async/Await ile yapılan işlemlerin daha senkronmuş gibi görünmesi, hata yönetimini de daha sezgisel hale getirir.
```javascript
const fs = require('fs').promises;
async function readFile() {
try {
const data = await fs.readFile('data.json', 'utf8');
console.log('Dosya başarıyla okundu:', data);
} catch (err) {
console.error('Hata oluştu:', err);
}
}
```
Try/Catch ile Hataları Yönetmek
```javascript
async function fetchData() {
try {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
console.log(data);
} catch (err) {
console.error('Veri çekme hatası:', err);
}
}
```
Asenkron Hataları Düzgün Bir Şekilde Ele Almak İçin En İyi Pratikler
1. Global Hata İşleyiciler Kullanmak: Uygulamanızda global hata işleyiciler kullanarak tüm hataları merkezi bir noktada yönetebilirsiniz. Node.js için `process.on('uncaughtException')` gibi event listener'ları kullanarak, hata yönetimini en üst seviyeye taşıyabilirsiniz.
2. Hata Loglama: Hata mesajları yalnızca konsola yazılmamalıdır. Hata mesajlarını bir log dosyasına kaydetmek ya da bir hata takip sistemine göndermek, özellikle büyük projelerde önemlidir. Böylece hataları geri dönüp inceleyebilir ve hızlıca çözüm geliştirebilirsiniz.
3. Graceful Shutdown: Uygulamanızda beklenmeyen hatalar meydana geldiğinde, sistemin düzgün bir şekilde kapanmasını sağlamak kritik bir adım olabilir. `process.exit()` gibi komutlarla süreci sonlandırmadan önce, gerekli temizliği yaparak uygulamanın düzgün kapanmasını sağlayın.
4. Error Boundaries Kullanmak: Özellikle frontend geliştirmede, React gibi kütüphanelerde Error Boundaries kullanarak, bileşen bazında hataları yakalayabilirsiniz. Backend tarafında da benzer bir strateji uygulayarak uygulamanızın daha sağlam olmasını sağlayabilirsiniz.
Callback Hell ile Baş Etmek
Örneğin, aşağıdaki gibi bir kod, karmaşık ve hataların kolayca gözden kaçabileceği bir yapıya sahiptir:
```javascript
fs.readFile('file1.txt', 'utf8', (err, data1) => {
if (err) throw err;
fs.readFile('file2.txt', 'utf8', (err, data2) => {
if (err) throw err;
fs.readFile('file3.txt', 'utf8', (err, data3) => {
if (err) throw err;
console.log('Veriler:', data1, data2, data3);
});
});
});
```
Bu kodu, Async/Await ile şu şekilde daha okunabilir hale getirebiliriz:
```javascript
async function readFiles() {
try {
const data1 = await fs.readFile('file1.txt', 'utf8');
const data2 = await fs.readFile('file2.txt', 'utf8');
const data3 = await fs.readFile('file3.txt', 'utf8');
console.log('Veriler:', data1, data2, data3);
} catch (err) {
console.error('Hata oluştu:', err);
}
}
```
Sonuç
---