Выразительный JavaScript.

Упражнения.

Повтор.

Допустим, у вас есть функция primitiveMultiply, которая в 50% случаев перемножает 2 числа, а в остальных случаях выбрасывает исключение типа MultiplicatorUnitFailure. Напишите функцию, обёртывающую эту, и просто вызывающую её до тех пор, пока не будет получен успешный результат.

Убедитесь, что вы обрабатываете только нужные вам исключения.

Function MultiplicatorUnitFailure() {}.

Function primitiveMultiply(a, b) {

If (Math.random() < 0.5).

Return a * b;

Else.

Throw new MultiplicatorUnitFailure();

}

Function reliableMultiply(a, b) {

// Ваш код.

}

Console.log(reliableMultiply(8, 8));

// → 64.

Запертая коробка.

Рассмотрим такой, достаточно надуманный, объект:

Var box = {

Locked: true,

Unlock: function() { this.locked = false; },

Lock: function() { this.locked = true; },

_content: [],

Get content() {

If (this.locked) throw new Error("Заперто!");

Return this._content;

}

};

Это коробочка с замком. Внутри лежит массив, но до него можно добраться только, когда коробка не заперта. Напрямую обращаться к свойству _content нельзя.

Напишите функцию withBoxUnlocked, принимающую в качестве аргумента функцию, которая отпирает коробку, выполняет функцию, и затем обязательно запирает коробку снова перед выходом – неважно, выполнилась ли переданная функция правильно, или она выбросила исключение.

Function withBoxUnlocked(body) {

// Ваш код.

}

WithBoxUnlocked(function() {

Box.content.push("золотишко");

});

Try {

WithBoxUnlocked(function() {

Throw new Error("Пираты на горизонте! Отмена!");

});

} catch (e) {

Console.log("Произошла ошибка:", e);

}

Console.log(box.locked);

// → true.

В качестве призовой игры убедитесь, что при вызове withBoxUnlocked, когда коробка не заперта, коробка остаётся незапертой.