抛出的JavaScript异常不是类型"错误"

时间:2017-02-08 00:26:20

标签: javascript node.js

我使用Restify和Restify库中的某个地方,由于用户端的一些错误输入而引发异常。我在下面有一些简化的代码可以重现这个问题。下面的示例中的问题是在尝试执行doesntexist.nofunction的异步函数中。发生的事情是抛出一个异常然后被捕获到" server.on(' uncaughtException .."函数,但"错误"对象实际上是" ; IncomingMessage"类型,而不是"错误"类型。我对此有几个问题。

  

1)抛出的异常应始终为"错误"如果没有,是   这是Restify中的一个错误?

     

2)对于同时设置回调参数的库来说,这是最佳做法吗?   一个"错误"参数如果出现错误,让客户端处理它   回调而不是库抛出异常?

var restify = require('restify');

//Test with long stack traces and without it.
//var longStackTraces = require('long-stack-traces');

const server = restify.createServer({
    name: 'myapp',
    version: '1.0.0'
});

server.get('/', function (req, res, next) {
    try {
        setTimeout(function () {
            doesntexist.nofunction();
        }, 200);

        return next();
    } catch (err) {
        console.log("Caught error");
    }
});

server.on('uncaughtException', function (err) {
    console.log("uncaught exception1: " + err.constructor);
});

process.on('uncaughtException', function (err) {
    console.log("uncaught exception2: " + err.constructor);
});

server.listen(9123, function () {
    console.log('%s listening at %s', server.name, server.url);
});

测试:

curl http://localhost:9123

没有长堆栈跟踪的控制台输出:

myapp listening at http://[::]:9123
uncaught exception1: function IncomingMessage(socket) {
  Stream.Readable.call(this)
...
Error: uncaught exception1
    at Server.<anonymous> (/usr/apps/myapp/Temp.js:22:12)
    at emitMany (events.js:132:20)
    at Server.emit (events.js:201:7)
    at Domain.onError (/usr/apps/myapp/node_modules/restify/lib/server.js:968:18)
    at emitOne (events.js:96:13)
    at Domain.emit (events.js:188:7)
    at Domain._errorHandler (domain.js:97:23)
    at process._fatalException (bootstrap_node.js:293:33)

没有长堆栈跟踪的控制台输出:

1 个答案:

答案 0 :(得分:1)

  1. 节点样式的回调函数应该具有err作为第一个参数的签名。这本身并不是任何规范,而是社区规范。
  2. 您的代码是这样的:

    server.get('/', function (req, res, next) {
        try {
            setTimeout(function () {
                doesntexist.nofunction();
            }, 200);
    
            return next();
        } catch (err) {
            console.log("Caught error");
        }
    });
    

    我会像这样重写它:

    server.get('/', function (req, res, next) {
        setTimeout(function () {
            try {
                doesntexist.nofunction();
                next();
            } catch (err) {
                next(err);
            }
        }, 200);
    });
    

    next是一个节点样式的回调函数,err作为第一个参数,就像传统一样。通过在需要时提供err参数来利用它。