Выразительный JavaScript (Хавербеке) - страница 90

или пока мы не дойдём до дна стека. Значение исключения будет передано в блок >catch, который сможет удостовериться в том, что это исключение действительно то, которое он ждёт, и обработать его. Для работы с непредсказуемыми событиями в потоке программы можно использовать блоки >finally, чтобы определённые части кода были выполнены в любом случае.

Упражнения

Повтор

Допустим, у вас есть функция >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, когда коробка не заперта, коробка остаётся незапертой.

9. Регулярные выражения

Некоторые люди, столкнувшись с проблемой, думают: «О, а использую-ка я регулярные выражения». Теперь у них есть две проблемы.

Джейми Завински

Юан-Ма сказал: «Требуется большая сила, чтобы резать дерево поперёк структуры древесины. Требуется много кода, чтобы программировать поперёк структуры проблемы.

Мастер Юан-Ма, «Книга программирования»

Инструменты и техники программирования выживают и распространяются хаотично-эволюционным способом. Иногда выживают не красивые и гениальные, а просто такие, которые достаточно хорошо работают в своей области – к примеру, если их интегрируют в другую успешную технологию.