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.jsturi irreportError()beiinstallGlobalHandlers()— 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.