Haxe中的异步异常处理

时间:2012-10-17 15:52:52

标签: node.js haxe

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您的try / catch语句只捕获createServerserver.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,所以我的细节可能是错的,但一般概念应该是正确的;)