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

raw
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);
  1. 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) = "";
  2. else

    12  reason = "negative";13} else {14  value = number15;15}
  3. 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
  1. 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) = "";
  2. if (number < 0)

    9  reason = "not a number";10} else if (number-1 < 0) {11  ok = false;12  reason = "negative";13} else {
  3. 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
  1. 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) = "";
  2. 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) {
  3. 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