我目前正在尝试处理将用于关键信息的NodeJS应用程序中的异常和错误。我需要一个干净的错误管理! 我一直想知道是否有类似Java Exceptions封装的东西。
我正在解释。
在Java中你可以做类似的事情:
try {
// something that throws Exception
} catch (Throwable t) {
throw new Exception("My message", t);
}
这允许您决定何时记录异常并获得整个堆栈跟踪和调用路径!
我想知道在NodeJS中是否有办法做同样的事情,因为每一步的记录似乎都不是正确的做法。
谢谢。
答案 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);
}
然后,您可以抛出自己的自定义异常实例,其中包含您需要的任何调试信息。
编辑:将堆栈跟踪添加到异常对象