Lekcje modułu (4/4)
try / catch / throw
Błąd (error) w JavaScript to wartość (zazwyczaj obiekt Error), która przerywa
normalny przepływ wykonywania programu i wędruje w górę stosu wywołań, dopóki ktoś
jej nie przechwyci. Konstrukcją służącą do obsługi takich sytuacji jest try / catch.
Zgłaszanie błędu: throw
function dividi(a, b) {
if (b === 0) {
throw new Error('Divisione per zero');
}
return a / b;
}throw natychmiast przerywa działanie bieżącej funkcji.
Przechwytywanie: try / catch
try {
const r = dividi(10, 0);
console.log('ok', r);
} catch (err) {
console.log('errore:', err.message); // 'errore: Divisione per zero'
}
// Program kontynuuje działanie w tym miejscu, nawet jeśli wystąpił błąd.Wykonuje się wszystko, co znajduje się w bloku try; jeśli zostanie zgłoszony
błąd (za pomocą throw lub przez jakąkolwiek nieudaną operację), sterowanie przechodzi
do bloku catch. Zmienna po catch (...) otrzymuje ten błąd.
finally (opcjonalnie)
Kod, który wykonuje się zawsze, niezależnie od tego, czy wystąpił błąd, czy nie. Przydatne do zamykania/zwalniania zasobów:
try {
// ... operazione rischiosa
} catch (err) {
// ... log
} finally {
// ... pulizia (sempre eseguita)
}Kiedy stosować (a kiedy nie)
- Tak: operacje wejścia/wyjścia (I/O) (
JSON.parsena niezaufanych danych wejściowych,fetch, dostęp do dysku), konwersje, które mogą się nie powieść. - Raczej nie: do sterowania zwykłym przepływem programu. Jeśli wiesz, że dane wejściowe
mogą być niepoprawne, lepiej sprawdzić je instrukcją
if, niż zgłaszać i przechwytywać błąd.
// 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: '...' }Spróbuj sam
Zdefiniuj `safeDivide(a, b)`: jeśli b wynosi 0, zgłoś Error z komunikatem 'Divisione per zero', w przeciwnym razie zwróć a/b.
Pokaż wskazówkę
if (b === 0) throw new Error('...'); a potem return a / b.
Rozwiązanie dostępne po 3 próbach
Ćwiczenie powtórzeniowe
Zdefiniuj `parseJsonSafe(text)`: jeśli text to poprawny JSON, zwróć { ok: true, value: <obiekt> }, w przeciwnym razie { ok: false }. Użyj try/catch na JSON.parse.
Pokaż wskazówkę
Otocz JSON.parse blokiem try; w bloku catch zwróć { ok: false }.
Rozwiązanie dostępne po 3 próbach