Express might be catching that error. Iirc, it picks up errors you throw directly in middleware/routes. (As well as passing errors with next().)
If you throw an error indirectly though, it shouldn't be caught by express' error handler, and be picked up by your handler instead:
app.get("/uncaughtException", function (req, res) {
setTimeout(function () {
throw new Error("uncaught error");
}, 1000);
res.send('uncaughtException');
});
process.addListener("uncaughtException", function (err) {
console.log("Uncaught exception: " + err);
});