Eval-калÑкÑлÑÑÐ¾Ñ Ñ Ð¾Ñибками
ÐапиÑиÑе инÑеÑÑейÑ, коÑоÑÑй пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð¼Ð°ÑемаÑиÑеÑкое вÑÑажение (в prompt) и вÑÐ²Ð¾Ð´Ð¸Ñ ÑезÑлÑÑÐ°Ñ ÐµÐ³Ð¾ вÑÑиÑÐ»ÐµÐ½Ð¸Ñ ÑеÑез eval.
ÐÑи оÑибке нÑжно вÑводиÑÑ ÑообÑение и пÑоÑиÑÑ Ð¿ÐµÑеввеÑÑи вÑÑажение.
ÐÑибкой ÑÑиÑаеÑÑÑ Ð½Ðµ ÑолÑко некоÑÑекÑное вÑÑажение, Ñакое как 2+, но и вÑÑажение, возвÑаÑаÑÑее NaN, напÑÐ¸Ð¼ÐµÑ 0/0.
ÐÑÑиÑлиÑÑ Ð»Ñбое вÑÑажение нам Ð¿Ð¾Ð¼Ð¾Ð¶ÐµÑ eval:
alert( eval("2+2") ); // 4
СÑиÑÑваем вÑÑажение в Ñикле while(true). ÐÑли пÑи вÑÑиÑлении Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ Ð¾Ñибка â ловим ÐµÑ Ð² try..catch.
ÐÑибкой ÑÑиÑаеÑÑÑ, в Ñом ÑиÑле, полÑÑение NaN из eval, Ñ
оÑÑ Ð¿Ñи ÑÑом иÑклÑÑение не возникаеÑ. Ðожно бÑоÑиÑÑ ÑÐ²Ð¾Ñ Ð¸ÑклÑÑение в ÑÑом ÑлÑÑае.
Ðод ÑеÑениÑ:
var expr, res;
while (true) {
expr = prompt("ÐведиÑе вÑÑажение?", '2-');
if (expr == null) break;
try {
res = eval(expr);
if (isNaN(res)) {
throw new Error("РезÑлÑÑÐ°Ñ Ð½ÐµÐ¾Ð¿ÑеделÑн");
}
break;
} catch (e) {
alert( "ÐÑибка: " + e.message + ", повÑоÑиÑе ввод" );
}
}
alert( res );