Пракід выключэнняў у JavaScript
Разгледзім блок catch
задачы з JSON прадукту:
catch (error) {
if (error.name == 'SyntaxError') {
alert('Некарэктны JSON прадукту');
} else if (error.name == 'ProductCostError') {
alert('У прадукту адсутнічае цана або колькасць');
}
}
Як вы бачыце, мы лавім два запланаваныя
намі выключэнні і як-то рэагуем на гэта.
Але што будзе, калі ўзнікне не прадугледжанае
намі выключэнне іншага тыпу? У гэтым выпадку
яно таксама трапіць у блок catch
, але
ніякай рэакцыі на гэта не адбудзецца, так
як выключэнне з іншым тыпам проста не трапіць
ні ў адзін з нашых іфаў.
Калі я кажу, што не будзе ніякай рэакцыі, то маю на ўвазе, што рэальна ніякай: нават не будзе вываду памылкі ў кансоль. Наш код проста маўчкі не будзе працаваць.
Таму існуе наступнае правіла: ваш
код павінен лавіць толькі тыя выключэнні, з
якімі ведае, як справіцца. Калі выключэнне
невядомае, то яго трэба пракінуць
далей з дапамогай throw
. У гэтым выпадку
вышэй яго зловіць хто-то больш асведчаны
альбо выключэнне вываліцца памылкай у кансоль.
Давайце паправім наш код:
catch (error) {
if (error.name == 'SyntaxError') {
alert('Некарэктны JSON прадукту');
} else if (error.name == 'ProductCostError') {
alert('У прадукту адсутнічае цана або колькасць');
} else {
throw error; // пракідваем выключэнне далей
}
}
Дадзены наступны код:
try {
let arr = JSON.parse(json);
for (let i = 0; i < arr.length; i++) {
localStorage.setItem(i, arr[i]);
}
} catch (error) {
if (error.name == 'QuotaExceededError') {
alert('скончылася месца ў сховішчы');
}
if (error.name == 'SyntaxError') {
alert('некарэктны JSON');
}
}
Што не так з гэтым кодам? Выпраўце яго на больш удалы.