• 习题
    • 重试
    • 上锁的箱子

    习题

    重试

    假设有一个函数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