所以,琐碎的事情。我们都知道Express有内置的默认错误处理程序,它需要四个参数(err,req,res,next)来处理"同步异常"比如ReferenceError,TypeError等:
更新:这个问题是特定于Express的,而不是关于如何捕获未处理的异常/等。我想知道在第一个代码块Express中如何处理用户定义的异常。第二个例子是异步。例外并不直接属于这个问题。
const express = require('express')();
express.all('*', (req, res) => {
throw new Error('my own error');
res
.send('okay?');
});
express.use((err, req, res, next) => {
console.error(err.stack);
res
.status(503)
.send('Express is still up and running');
}).listen(3000);
但不是这样:
const express = require('express')();
express.all('*', (req, res) => {
process.nextTick(() => {
throw new Error('my own error');
});
res
.send('okay?');
});
express.use((err, req, res, next) => {
console.error(err.stack);
res
.status(503)
.send('Won\'t be executed');
}).listen(3000);
但我对这个处理程序的实现感到好奇。
我找不到像
这样的东西 process.on('uncaughtException'...
或domains / Promises / cluster。
也许我想念一些东西。
任何人都可以澄清吗?
答案 0 :(得分:1)
执行catch-all kind of block in Express's router:
try {
fn(req, res, next);
} catch (err) {
next(err);
}
因此,在此块中,所有异常都被捕获并转换为next()
函数调用,并将错误参数设置为匹配异常。
更详细地说,当请求到达时表达:
app.handle()
,然后确定路由器并调用router.handle()
router.handle()
处理图层并最终匹配使用express.all('*', ...)
签名handle_request
(在路由器内部的Layer模块中)调用上述try-catch块中指定的处理函数,有效地捕获所有可能的异常并将它们转换为下一个调用。