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

task
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);
  1. task ← save, open ← false, outcome ← (empty)

    1const task→ save = "save"; //@task="skip", "send"2let open→ false = false;3let outcome→ (empty) = "";
  2. open ← true

    2let open = false;3let outcome = "";45try {6  open = true;7  if (task === "skip") {
    values this steptrueopen
  3. else

    8  outcome = "skipped";9} else {10  outcome = "done:" + tasksave;11}
  4. open ← false

    11  }12} finally {13  open = false;14}
    values this stepfalseopen
  5. console.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
  1. task ← skip, open ← false, outcome ← (empty)

    1const task→ skip = "skip";2let open→ false = false;3let outcome→ (empty) = "";
  2. open ← true

    2let open = false;3let outcome = "";45try {6  open = true;7  if (task === "skip") {
    values this steptrueopen
  3. if (task === "skip")

    5try {6  open = true;7  if (taskskip === "skip") {8    outcome = "skipped";9  } else {
  4. open ← false

    11  }12} finally {13  open = false;14}
    values this stepfalseopen
  5. console.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
  1. task ← send, open ← false, outcome ← (empty)

    1const task→ send = "send";2let open→ false = false;3let outcome→ (empty) = "";
  2. open ← true

    2let open = false;3let outcome = "";45try {6  open = true;7  if (task === "skip") {
    values this steptrueopen
  3. else

    8  outcome = "skipped";9} else {10  outcome = "done:" + tasksend;11}
  4. open ← false

    11  }12} finally {13  open = false;14}
    values this stepfalseopen
  5. console.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