Modül dersleri (4/4)
dene / yakala / at
JavaScript'teki hata, normal akışı kesintiye uğratan bir değerdir (genellikle bir Error nesnesi)
ve birisi onu yakalayana kadar çağrı yığınını kabartır. Bu durumu ele alacak yapı
try / catch.
Hata atılıyor: throw
function dividi(a, b) {
if (b === 0) {
throw new Error('Divisione per zero');
}
return a / b;
}throw mevcut işlevi anında kesintiye uğratır.
İlgi çekici: try / catch
try {
const r = dividi(10, 0);
console.log('ok', r);
} catch (err) {
console.log('errore:', err.message); // 'errore: Divisione per zero'
}
// Il programma continua qui, anche se c'è stato un errore.try içindeki her şey yürütülür; bir hata atılırsa (throw aracılığıyla veya herhangi bir işlemle)
başarısız olursa), kontrol catch bloğuna atlar. catch (...)'den sonraki değişken hatayı alıyor.
finally (isteğe bağlı)
Hata olsun ya da olmasın her zaman çalışan kod. Kaynakları kapatmak için kullanışlıdır:
try {
// ... operazione rischiosa
} catch (err) {
// ... log
} finally {
// ... pulizia (sempre eseguita)
}Ne zaman kullanılmalı (ve ne zaman kullanılmamalı)
- Evet: G/Ç işlemleri (güvenilmeyen girişte
JSON.parse,fetch, disk erişimi), dönüşümler başarısız olabilir. - Belki de değil: normal akış için. Bir girişin geçersiz olabileceğini biliyorsanız kontrol etmeniz daha iyi olur
ifile fırlatıp yakalamaktan daha iyidir.
// Tipico: parsing JSON difensivo
function parseJsonSafe(text) {
try {
return { ok: true, value: JSON.parse(text) };
} catch (err) {
return { ok: false, error: err.message };
}
}
parseJsonSafe('{"a":1}'); // { ok: true, value: {a:1} }
parseJsonSafe('non json'); // { ok: false, error: '...' }Deneyin
SafeDivide(a, b)`yi tanımlayın: eğer b 0 ise 'Sıfır başına bölme' mesajını içeren bir Hata atar, aksi takdirde a/b değerini döndürür.
İpucu göster
if (b === 0) throw new Error('...'); sonra a / b'yi döndürün.
3 denemeden sonra çözüm mevcut
Alıştırmayı gözden geçirin
`parseJsonSafe(text)`i tanımlayın: eğer metin geçerliyse JSON döndürün { ok: true, value: <object> }, aksi takdirde { ok: false }. JSON.parse'da try/catch'i kullanın.
İpucu göster
JSON.parse'ı denemede sarın; yakalama dönüşünde { ok: false }.
3 denemeden sonra çözüm mevcut