Failure failing in CATCH

To bring home to later readers the full force of what Yoda said in their comment, the simplest solution is to unlearn the notion that you have to try in order to CATCH. You don't:

sub foo() 
{
  say 1 / 0;
  CATCH { default { fail "FAIL" } }
  return True;
}

with foo() { 
    say "done";
}
else
{
  say "handled {.exception.message}"
}

correctly displays:

handled FAIL

According to the Failure documentation this seems to be the defined behavior.

Sink (void) context causes a Failure to throw, i.e. turn into a normal exception. The use fatal pragma causes this to happen in all contexts within the pragma's scope. Inside try blocks, use fatal is automatically set, and you can disable it with no fatal.

You can try to use the no fatal pragma.

sub foo() {
try {
    no fatal;
    say 1 / 0;
    CATCH { default { fail "FAIL" } }
  }
}

unless foo()  {
     say "handled"
}