NodeJS错误封装

时间:2016-05-26 12:22:11

标签: node.js error-handling encapsulation propagation

我目前正在尝试处理将用于关键信息的NodeJS应用程序中的异常和错误。我需要一个干净的错误管理! 我一直想知道是否有类似Java Exceptions封装的东西。

我正在解释。

在Java中你可以做类似的事情:

try {
    // something that throws Exception
} catch (Throwable t) {
    throw new Exception("My message", t);
}

这允许您决定何时记录异常并获得整个堆栈跟踪和调用路径!

我想知道在NodeJS中是否有办法做同样的事情,因为每一步的记录似乎都不是正确的做法。

谢谢。

3 个答案:

答案 0 :(得分:1)

你应该看一下这个模块: https://www.npmjs.com/package/verror

Joyent在他的错误管理最佳实践中引用它:https://www.joyent.com/developers/node/design/errors

  

在Joyent,我们使用verror模块来包装错误,因为它是错误的   语法简洁。在撰写本文时,它并没有做到全部   这还没有,但它会延伸到这样做。

它允许您获取有关错误消息的详细信息。并跟踪错误的步骤。

并且还隐藏了包含错误的客户端的详细信息:WError()只返回上一条错误消息。

答案 1 :(得分:1)

我回答我自己的问题来解释我最终做了什么以获得所需的封装。 我使用https://www.npmjs.com/package/verror作为Sachacr的建议。

然后我就这样扩展了:

my_error.js:

var VError          = require('verror');
var _               = require('lodash');

function MyError() {
    var args = [];

    var httpErrorCode;
    var cause;

    if (arguments.length > 0) {
        var lastArgumentIndex = [arguments.length];

        cause = manageCause(lastArgumentIndex, arguments);
        httpErrorCode = manageHttpCode(lastArgumentIndex, arguments);

        for (var i = 0; i < lastArgumentIndex; i++) {
            args[i] = arguments[i];
        }
    }

    this.__proto__.__proto__.constructor.apply(this, args);

    if (cause) {
        if (this.stack) {
            this.stack += '\n' + cause.stack;
        } else {
            this.stack = cause.stack;
        }
    }

    this.httpErrorCode = httpErrorCode;
}

MyError.prototype.__proto__ = VError.prototype;

function manageCause(lastArgumentIndex, arguments) {
    if (lastArgumentIndex[0] > 0
        && arguments[lastArgumentIndex[0] - 1] instanceof Error) {

        lastArgumentIndex[0]--;
        return arguments[lastArgumentIndex[0]];
    }
}

function manageHttpCode(lastArgumentIndex, arguments) {
    if (lastArgumentIndex[0] > 0
        && _.isNumber(arguments[lastArgumentIndex[0] - 1])) {

        lastArgumentIndex[0]--;
        return arguments[lastArgumentIndex[0]];
    }
}

module.exports = MyError;

它允许我在我的代码中轻松使用它:

var MyError = require('./my_error.js');

function withErrors() {
    try {
        // something with errors
    } catch (err) {
        // This is the same pattern as VError
        return new MyError("My message", err, 401);
    }
}

function somethingToDo(req, res) {
    var result = withErrors();

    if (result instanceof MyError) {
        logger.warn(result);
        res.status(result.httpErrorCode).send(result.message).end();
        return
    }
}

这样,我有一个很好的堆栈跟踪与调用路径和错误/异常中涉及的每一行。

希望它会帮助人们,因为我搜索了一个漫长的时间:)

编辑:我修改了MyError类以添加HTTP错误代码并清理参数管理。

答案 2 :(得分:0)

您应该可以执行以下操作:

funtion exception(message, error) {
    this.message = message;
    this.stacktrace = error.stack;
}

try {
   if(someData == false)
      throw new exception("something went wrong!", new Error());
}
catch(ex) {
    console.log(ex.message);
    console.log(ex.stacktrace);
}

然后,您可以抛出自己的自定义异常实例,其中包含您需要的任何调试信息。

编辑:将堆栈跟踪添加到异常对象