习题

重试

假设有一个函数primitiveMultiply,在 20% 的情况下将两个数相乘,在另外 80% 的情况下会触发MultiplicatorUnitFailure类型的异常。编写一个函数,调用这个容易出错的函数,不断尝试直到调用成功并返回结果为止。

确保只处理你期望的异常。

  1. class MultiplicatorUnitFailure extends Error {}
  2. function primitiveMultiply(a, b) {
  3. if (Math.random() < 0.2) {
  4. return a * b;
  5. } else {
  6. throw new MultiplicatorUnitFailure();
  7. }
  8. }
  9. function reliableMultiply(a, b) {
  10. // Your code here.
  11. }
  12. console.log(reliableMultiply(8, 8));
  13. // → 64

上锁的箱子

考虑以下这个编写好的对象:

  1. const box = {
  2. locked: true,
  3. unlock() { this.locked = false; },
  4. lock() { this.locked = true; },
  5. _content: [],
  6. get content() {
  7. if (this.locked) throw new Error("Locked!");
  8. return this._content;
  9. }
  10. };

这是一个带锁的箱子。其中有一个数组,但只有在箱子被解锁时,才可以访问数组。不允许直接访问_content属性。

编写一个名为withBoxUnlocked的函数,接受一个函数类型的参数,其作用是解锁箱子,执行该函数,无论是正常返回还是抛出异常,在withBoxUnlocked函数返回前都必须锁上箱子。

  1. const box = {
  2. locked: true,
  3. unlock() { this.locked = false; },
  4. lock() { this.locked = true; },
  5. _content: [],
  6. get content() {
  7. if (this.locked) throw new Error("Locked!");
  8. return this._content;
  9. }
  10. };
  11. function withBoxUnlocked(body) {
  12. // Your code here.
  13. }
  14. withBoxUnlocked(function() {
  15. box.content.push("gold piece");
  16. });
  17. try {
  18. withBoxUnlocked(function() {
  19. throw new Error("Pirates on the horizon! Abort!");
  20. });
  21. } catch (e) {
  22. console.log("Error raised:", e);
  23. }
  24. console.log(box.locked);
  25. // → true