Error Handling Patterns
finally Cleanup
Run cleanup code after a protected block.
finally-cleanup
`finally` runs after the `try` block finishes, whether the block used the normal path or left early because of an error.
finally Cleanup
finally_cleanup.js
Replay: real traced execution (multi-file project)
const task = "save";
let open = false;
let outcome = "";
try {
open = true;
if (task === "skip") {
outcome = "skipped";
} else {
outcome = "done:" + task;
}
} finally {
open = false;
}
console.log("task=" + task);
console.log("outcome=" + outcome);
console.log("open=" + open);
const task = "skip";
let open = false;
let outcome = "";
try {
open = true;
if (task === "skip") {
outcome = "skipped";
} else {
outcome = "done:" + task;
}
} finally {
open = false;
}
console.log("task=" + task);
console.log("outcome=" + outcome);
console.log("open=" + open);
const task = "send";
let open = false;
let outcome = "";
try {
open = true;
if (task === "skip") {
outcome = "skipped";
} else {
outcome = "done:" + task;
}
} finally {
open = false;
}
console.log("task=" + task);
console.log("outcome=" + outcome);
console.log("open=" + open);
task ← save, open ← false, outcome ← (empty)
1const task→ save = "save"; //@task="skip", "send"2let open→ false = false;3let outcome→ (empty) = "";open ← true
2let open = false;3let outcome = "";45try {6 open = true;7 if (task === "skip") {values this steptrueopenelse
8 outcome = "skipped";9} else {10 outcome = "done:" + tasksave;11}open ← false
11 }12} finally {13 open = false;14}values this stepfalseopenconsole.log("task=" + task);
13 open = false;14}1516console.log("task=" + tasksave);17console.log("outcome=" + outcomedone:save);18console.log("open=" + openfalse);outputtask=save outcome=done:save open=false
task ← skip, open ← false, outcome ← (empty)
1const task→ skip = "skip";2let open→ false = false;3let outcome→ (empty) = "";open ← true
2let open = false;3let outcome = "";45try {6 open = true;7 if (task === "skip") {values this steptrueopenif (task === "skip")
5try {6 open = true;7 if (taskskip === "skip") {8 outcome = "skipped";9 } else {open ← false
11 }12} finally {13 open = false;14}values this stepfalseopenconsole.log("task=" + task);
13 open = false;14}1516console.log("task=" + taskskip);17console.log("outcome=" + outcomeskipped);18console.log("open=" + openfalse);outputtask=skip outcome=skipped open=false
task ← send, open ← false, outcome ← (empty)
1const task→ send = "send";2let open→ false = false;3let outcome→ (empty) = "";open ← true
2let open = false;3let outcome = "";45try {6 open = true;7 if (task === "skip") {values this steptrueopenelse
8 outcome = "skipped";9} else {10 outcome = "done:" + tasksend;11}open ← false
11 }12} finally {13 open = false;14}values this stepfalseopenconsole.log("task=" + task);
13 open = false;14}1516console.log("task=" + tasksend);17console.log("outcome=" + outcomedone:send);18console.log("open=" + openfalse);outputtask=send outcome=done:send open=false