-
Notifications
You must be signed in to change notification settings - Fork 0
/
chapter08-debugging.js
80 lines (63 loc) · 1.41 KB
/
chapter08-debugging.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
"use strict"
// Retry
class MultiplicatorUnitFailure extends Error {}
function primitiveMultiply(a, b) {
if (Math.random() < 0.2) {
return a * b;
} else {
throw new MultiplicatorUnitFailure('Klunk');
}
}
function reliableMultiply(a, b) {
let result = -1;
for (;;) {
try {
result = primitiveMultiply(a, b);
break;
} catch (e) {
continue;
}
}
return result;
}
console.log(reliableMultiply(8, 8));
console.log(reliableMultiply(6, 7));
// Locked Box
/*
Write a function called withBoxUnlocked that takes a
function value as argument, unlocks the box, runs the
function, and then ensures that the box is locked again
before returning, regardless of whether the argument
function returned normally or threw an exception.
*/
const box = {
locked: true,
unlock() { this.locked = false },
lock() { this.locked = true },
_content: [],
get content() {
if (this.locked) throw new Error('Locked!');
return this._content;
}
};
function withBoxUnlocked(body) {
const lockStatus = box.locked;
if (lockStatus) { box.unlock(); }
try {
body();
} finally {
if (!lockStatus) { box.lock(); }
}
}
withBoxUnlocked(function() {
box.content.push("gold piece");
})
try {
withBoxUnlocked(function() {
throw new Error("Pirates on the horizon! Abort!");
})
} catch (e) {
console.log("Error raised:", e);
}
console.log(box.locked);
// -> true