Przejdź do głównej treści
eLearner.app
Moduł 5 · Lekcja 4 z 420/32 w kursie~12 min
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

JS
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

JS
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:

JS
try {
  // ... operazione rischiosa
} catch (err) {
  // ... log
} finally {
  // ... pulizia (sempre eseguita)
}

Kiedy stosować (a kiedy nie)

  • Tak: operacje wejścia/wyjścia (I/O) (JSON.parse na 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.
JS
// 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

Ćwiczenie#js.m5.l4.e1
Próby: 0Ładowanie...

Zdefiniuj `safeDivide(a, b)`: jeśli b wynosi 0, zgłoś Error z komunikatem 'Divisione per zero', w przeciwnym razie zwróć a/b.

Ładowanie edytora...
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

Ćwiczenie#js.m5.l4.e2
Próby: 0Ładowanie...

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.

Ładowanie edytora...
Pokaż wskazówkę

Otocz JSON.parse blokiem try; w bloku catch zwróć { ok: false }.

Rozwiązanie dostępne po 3 próbach