NodeJS错误封装

NodeJS Error Encapsulation

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

我在解释。

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

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

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

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

谢谢。

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

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);
}

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

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

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

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

At Joyent, we use the verror module to wrap errors since it's syntactically concise. As of this writing, it doesn't quite do all of this yet, but it will be extended to do so.

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

并且还通过包装错误向客户端隐藏详细信息:WEError() returns 只有最后一条错误消息。

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

然后我这样扩展它:

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
    }
}

这样,我就有了一个很好的堆栈跟踪,其中包含调用路径和 error/exception 中涉及的每一行。

希望它能帮助人们,因为我搜索了很长时间:)

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