NodeJS 错误封装



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

我在解释。

在Java中,你可以做这样的事情:

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

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

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

谢谢。

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

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

在 Joyent,我们使用 verror 模块来包装错误,因为它是 语法简洁。在撰写本文时,它并没有完全完成所有工作 这还没有,但它将被扩展以这样做。

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

并且还隐藏了带有包装错误的客户端的详细信息:WError(),他只返回最后一条错误消息。

我回答我自己的问题来解释我最终做了什么来获得想要的封装。我按照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
    }
}

这样,我就可以使用调用路径和错误/异常中涉及的每一行进行很好的堆栈跟踪。

希望它能帮助人们,因为我搜索了一个懒惰的时间:)

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

你应该能够执行以下操作:

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

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

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

相关内容

最新更新