1

使用异步 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 中处理异常的最佳实践是什么。

4

3 回答 3

1

我建议您尝试haxe-continuation,它将 Node.js 异常作为返回值处理。请参阅此示例

于 2013-02-16T14:52:40.647 回答
0

您的try / catch语句仅捕获createServerandserver.listen方法调用引发的错误,而不是请求处理程序中的逻辑。我对此不是 100% 确定的,但我的猜测是调用的异步性质意味着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/' );
    }
}

至于错误处理的最佳实践,haxennode 上的简单示例不包括任何错误处理,并使用内联匿名函数进行成功回调(我确信这与 Haxe 哲学完全兼容)。否则,带有节点示例的 Haxe 在地面上似乎相当薄弱。但是,这个关于处理节点中http错误的stackoverflow线程(通常)可能会有用;请注意,该方法会引发错误server.listen

于 2012-10-17T23:36:38.860 回答
0

我认为你应该完全避免 try/catch 并支持更面向 NodeJS 的策略。在handleRequest你应该能够req.abort()通过监听clientError事件来拦截错误server

免责声明:我没有使用 NodeJS,所以我的细节可能是错误的,但一般概念应该是正确的;)

于 2012-10-18T14:59:05.697 回答