Error Handling Patterns
Throwing Validation Errors
Reject invalid data by throwing an error.
throw-validation
`throw` stops the current path and sends control to the nearest matching `catch`. Validation code often throws when an input is not acceptable.
Throwing Validation Errors
throw_validation.js
Replay: real traced execution (multi-file project)
const count = 3;
let status = "";
function requirePositive(value) {
if (value <= 0) {
throw new Error("count must be positive");
}
return value;
}
try {
const accepted = requirePositive(count);
status = "accepted:" + accepted;
} catch (error) {
status = "rejected";
}
console.log("count=" + count);
console.log("status=" + status);
const count = 0;
let status = "";
function requirePositive(value) {
if (value <= 0) {
throw new Error("count must be positive");
}
return value;
}
try {
const accepted = requirePositive(count);
status = "accepted:" + accepted;
} catch (error) {
status = "rejected";
}
console.log("count=" + count);
console.log("status=" + status);
const count = 8;
let status = "";
function requirePositive(value) {
if (value <= 0) {
throw new Error("count must be positive");
}
return value;
}
try {
const accepted = requirePositive(count);
status = "accepted:" + accepted;
} catch (error) {
status = "rejected";
}
console.log("count=" + count);
console.log("status=" + status);
count ← 3, status ← (empty)
1const count→ 3 = 3; //@count=0, 82let status→ (empty) = "";try
8 return value;9}1011try {12 const accepted = requirePositive(count3);13 status = "accepted:" + accepted;function requirePositive(value)
1const count = 3; //@count=0, 82let status = "";34function requirePositive(value3) {5 if (value <= 0) {6 throw new Error("count must be positive");7 }8 return value3;9}accepted ← 3, status ← accepted:3
11try {12 const accepted→ 3 = requirePositive(count3);13 status = "accepted:" + accepted3;14} catch (error) {values this stepaccepted:3statusconsole.log("count=" + count);
15 status = "rejected";16}1718console.log("count=" + count3);19console.log("status=" + statusaccepted:3);outputcount=3 status=accepted:3
count ← 0, status ← (empty)
1const count→ 0 = 0;2let status→ (empty) = "";try
8 return value;9}1011try {12 const accepted = requirePositive(count0);13 status = "accepted:" + accepted;function requirePositive(value)
1const count = 0;2let status = "";34function requirePositive(value0) {5 if (value <= 0) {if (value <= 0)
4function requirePositive(value) {5 if (value0 <= 0) {6 throw new Error("count must be positive");7 }status ← rejected
13 status = "accepted:" + accepted;14} catch (error) {15 status = "rejected";16}values this steprejectedstatusconsole.log("count=" + count);
15 status = "rejected";16}1718console.log("count=" + count0);19console.log("status=" + statusrejected);outputcount=0 status=rejected
count ← 8, status ← (empty)
1const count→ 8 = 8;2let status→ (empty) = "";try
8 return value;9}1011try {12 const accepted = requirePositive(count8);13 status = "accepted:" + accepted;function requirePositive(value)
1const count = 8;2let status = "";34function requirePositive(value8) {5 if (value <= 0) {6 throw new Error("count must be positive");7 }8 return value8;9}accepted ← 8, status ← accepted:8
11try {12 const accepted→ 8 = requirePositive(count8);13 status = "accepted:" + accepted8;14} catch (error) {values this stepaccepted:8statusconsole.log("count=" + count);
15 status = "rejected";16}1718console.log("count=" + count8);19console.log("status=" + statusaccepted:8);outputcount=8 status=accepted:8