Tema
/
Interneto svetainių kliento dalies kūrimas JS

js/errors.js — tipizuotos klaidos

Kodo stulpelyje — js/errors.js. Bazinė klasė AppError turi code, cause ir retryable; iš jos paveldi konkrečios klaidos. Esmė — ne pati hierarchija, o kad kviečiantysis gali šakoti pagal klaidos tipą.

Dabar api.js (iš 4 pamokos) meta tipizuotas klaidas vietoj new Error(...):

import { NetworkError, RateLimitError, NotFoundError, ApiError } from './errors.js';

async function request(url) {
  let response;
  try {
    response = await fetch(url);
  } catch (cause) {
    throw new NetworkError(cause);            // tik tinklo lūžis patenka čia
  }
  if (response.ok) return response.json();

  if (response.status === 429) throw new RateLimitError();
  if (response.status === 404) throw new NotFoundError('That picture');
  if (response.status === 403) {              // NASA kartais 403-ina išnaudotą DEMO_KEY
    const body = await response.text().catch(() => '');
    if (body.toLowerCase().includes('rate limit')) throw new RateLimitError();
  }
  throw new ApiError(response.status, await response.text().catch(() => ''));
}

Dabar main.js gali reaguoti skirtingai: if (error.retryable) offerRetry(), o žinutę imti iš toMessage(error).

Patarimas (kur „Sentry"?). Tikroji errors.js turi ir reportError() bei installGlobalHandlers() — vieną vietą, kur klaidos siunčiamos į stebėjimo įrankį (Sentry, Datadog) ir kur pagaunama viskas, ko niekas kitas nepagavo (window.onerror, unhandledrejection). Programa niekada neturi mirti tyliai. Šias dalis pridėsim vėliau; kol kas svarbu — tipizuotos klaidos.