gpt4 book ai didi

node.js - 如何处理 node.js 中的代码异常?

转载 作者:IT老高 更新时间:2023-10-28 22:03:30 26 4
gpt4 key购买 nike

我浏览了 Express 的文档和 the part describing error handling对我来说完全不透明。

我认为他们所指的 app 是一个实例 createServer(),对吧?但是我不知道在处理请求期间发生异常时如何阻止 node.js 炸毁应用程序进程。

我真的不需要任何花哨的东西;每当出现异常时,我只想返回 500 的状态,再加上一个空响应。 Node 进程不得仅仅因为某处存在未捕获的异常而终止。

有没有一个简单的例子说明如何做到这一点?


var express = require('express');
var http = require('http');

var app = express.createServer();

app.get('/', function(req, res){
console.log("debug", "calling")
var options = {
host: 'www.google.com',
port: 80,
path: "/"
};
http.get(options, function(response) {
response.on("data", function(chunk) {
console.log("data: " + chunk);
chunk.call(); // no such method; throws here
});
}).on('error', function(e) {
console.log("error connecting" + e.message);
});
});

app.configure(function(){
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});

app.listen(3000);

使整个应用程序崩溃,产生回溯

mypath/tst.js:16
chunk.call(); // no such method; throws here
^ TypeError: Object ... has no method 'call'
at IncomingMessage.<anonymous> (/Library/WebServer/Documents/discovery/tst.js:16:18)
at IncomingMessage.emit (events.js:67:17)
at HTTPParser.onBody (http.js:115:23)
at Socket.ondata (http.js:1150:24)
at TCP.onread (net.js:374:27)

最佳答案

如果你真的想捕获所有异常并提供一些处理而不是退出 Node.js 进程,你需要处理 Node 的 uncaughtException事件。

如果你仔细想想,这是 Node 的事情,而不是 Express 的事情,因为如果你从任意一段代码中抛出异常,就不能保证 Express 能够或将永远看到它,或者处于某个位置把它困住。 (为什么?异常与 Node 风格的异步事件驱动的回调代码交互得不是很好。异常沿着调用堆栈向上移动以找到当时范围内的 catch() block 抛出异常。如果 myFunction 将某些工作推迟到某个事件发生时运行的回调函数,然后返回到事件循环,然后当调用该回调函数时,它会直接从主事件循环中调用,并且 myFunction 不再在调用堆栈上;如果此回调函数抛出异常,即使 myFunction 有一个 try/catch block ,它也不会捕获该异常.)

这在实践中意味着,如果您抛出异常并且自己没有捕获它,并且您在 Express 直接调用的函数中这样做,Express 可以捕获异常并调用您安装的错误处理程序,假设您已经配置了一些错误处理中间件,例如 app.use(express.errorHandler())。但是,如果您在响应异步事件而调用的函数中抛出相同的异常,Express 将无法捕获它。 (它可以捕获它的唯一方法是监听全局 Node uncaughtException 事件,首先这是一个坏主意,因为它是全局的,您可能需要将它用于其他事情,其次是因为 Express将不知道什么请求与异常相关联。)

这是一个例子。我将这段路由处理代码添加到现有的 Express 应用程序中:

app.get('/fail/sync', function(req, res) {
throw new Error('whoops');
});
app.get('/fail/async', function(req, res) {
process.nextTick(function() {
throw new Error('whoops');
});
});

现在,如果我在浏览器中访问 http://localhost:3000/fail/sync,浏览器会转储一个调用堆栈(显示 express.errorHandler 正在运行)。但是,如果我在浏览器中访问 http://localhost:3000/fail/async,浏览器会生气(Chrome 会显示“未收到数据:错误 324,net::ERR_EMPTY_RESPONSE:服务器关闭连接而不发送任何数据”消息),因为 Node 进程已退出,在我调用它的终端中的 stdout 上显示回溯。

关于node.js - 如何处理 node.js 中的代码异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10390658/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com