Error Handling Patterns
Result Patterns
Represent success or failure with data.
result-pattern
Some code avoids throwing and returns a result shape instead. This keeps the success path and failure reason explicit.
Result Patterns
result_pattern.js
Replay: real traced execution (multi-file project)
const raw = "15";
const number = Number(raw);
let ok = true;
let value = 0;
let reason = "";
if (Number.isNaN(number)) {
ok = false;
reason = "not a number";
} else if (number < 0) {
ok = false;
reason = "negative";
} else {
value = number;
}
const label = ok ? "value:" + value : "error:" + reason;
console.log("raw=" + raw);
console.log("label=" + label);
const raw = "-1";
const number = Number(raw);
let ok = true;
let value = 0;
let reason = "";
if (Number.isNaN(number)) {
ok = false;
reason = "not a number";
} else if (number < 0) {
ok = false;
reason = "negative";
} else {
value = number;
}
const label = ok ? "value:" + value : "error:" + reason;
console.log("raw=" + raw);
console.log("label=" + label);
const raw = "bad";
const number = Number(raw);
let ok = true;
let value = 0;
let reason = "";
if (Number.isNaN(number)) {
ok = false;
reason = "not a number";
} else if (number < 0) {
ok = false;
reason = "negative";
} else {
value = number;
}
const label = ok ? "value:" + value : "error:" + reason;
console.log("raw=" + raw);
console.log("label=" + label);
raw ← 15, number ← 15, ok ← true, value ← 0, reason ← (empty)
1const raw→ 15 = "15"; //@raw="-1", "bad"2const number→ 15 = Number(raw15);3let ok→ true = true;4let value→ 0 = 0;5let reason→ (empty) = "";else
12 reason = "negative";13} else {14 value = number15;15}label ← value:15
14 value = number;15}1617const label→ value:15 = oktrue ? "value:" + value15 : "error:" + reason(empty);1819console.log("raw=" + raw15);20console.log("label=" + labelvalue:15);outputraw=15 label=value:15
raw ← -1, number ← -1, ok ← true, value ← 0, reason ← (empty)
1const raw→ -1 = "-1";2const number→ -1 = Number(raw-1);3let ok→ true = true;4let value→ 0 = 0;5let reason→ (empty) = "";if (number < 0)
9 reason = "not a number";10} else if (number-1 < 0) {11 ok = false;12 reason = "negative";13} else {label ← error:negative
14 value = number;15}1617const label→ error:negative = okfalse ? "value:" + value0 : "error:" + reasonnegative;1819console.log("raw=" + raw-1);20console.log("label=" + labelerror:negative);outputraw=-1 label=error:negative
raw ← bad, number ← NaN, ok ← true, value ← 0, reason ← (empty)
1const raw→ bad = "bad";2const number→ NaN = Number(rawbad);3let ok→ true = true;4let value→ 0 = 0;5let reason→ (empty) = "";if (Number.isNaN(number))
4let value = 0;5let reason = "";67if (Number.isNaN(numberNaN)) {8 ok = false;9 reason = "not a number";10} else if (number < 0) {label ← error:not a number
14 value = number;15}1617const label→ error:not a number = okfalse ? "value:" + value0 : "error:" + reasonnot a number;1819console.log("raw=" + rawbad);20console.log("label=" + labelerror:not a number);outputraw=bad label=error:not a number