我目前正在尝试处理将用于关键信息的 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);
}
然后,可以抛出自己的自定义异常实例,其中包含所需的任何调试信息。
编辑:将堆栈跟踪添加到异常对象