> return err; // breaks, since err is spooky and only "scoped" in the catch block
Both err's? (the argument and the one you define)? How about:
try {
throw "error";
} catch (err) {
var e = err; // is this different from not shadowing err?
console.log(e)
} finally {
return e;
}