使用异步node.js处理Haxe中的异常的最佳做法是什么?
此代码不显示“haha:test”,而是显示“test”。
import js.Node;
class Main {
public static function handleRequest(req: NodeHttpServerReq, res: NodeHttpServerResp) {
res.setHeader("Content-Type","text/plain");
res.writeHead(200);
res.end('Hello World\n');
throw "test";
}
public static function main() {
try {
var server = Node.http.createServer(handleRequest);
server.listen(1337,"localhost");
} catch(e: String) {
trace("haha: " + e);
}
trace( 'Server running at http://127.0.0.1:1337/' );
}
}
我知道为什么没有抓住异常。问题是在Haxe处理异常的最佳做法是什么。
答案 0 :(得分:1)
我建议您尝试haxe-continuation,它将Node.js异常作为返回值处理。请参阅this example。
答案 1 :(得分:0)
您的try / catch
语句只捕获createServer
和server.listen
方法调用引发的错误,而不是请求处理程序中的逻辑。我对此并不是百分之百确定,但我的猜测是调用的异步性质意味着handleRequest
方法中抛出的错误也没有被捕获。如果您执行以下操作,您将获得预期的结果:
import js.Node;
class Main {
public static function handleRequest(req: NodeHttpServerReq, res: NodeHttpServerResp) {
res.setHeader("Content-Type","text/plain");
res.writeHead(200);
res.end('Hello World\n');
//throw "test";
}
public static function main() {
try {
var server = Node.http.createServer(handleRequest);
server.listen(1337,"localhost");
throw "test"; // Throwing the error here will result in it being caught below
} catch(e: String) {
trace("haha: " + e);
}
trace( 'Server running at http://127.0.0.1:1337/' );
}
}
至于错误处理的最佳实践,bare bones example on haxennode不包含任何错误处理,并使用内联匿名函数进行成功回调(不是我确信它与Haxe哲学完全兼容)。否则,具有节点示例的Haxe在地面上看起来相当薄。但是,this stackoverflow thread on handling http errors in node(通常)可能会有用;请注意server.listen
方法引发的错误。
答案 2 :(得分:0)
我认为你应该完全避免使用try / catch并支持更多面向NodeJS的策略。在handleRequest
中,您应该能够req.abort()
通过聆听clientError
上的server
事件来拦截错误。
免责声明:我没有使用NodeJS,所以我的细节可能是错的,但一般概念应该是正确的;)