Javascript 是否可以修改错误';使其包含引发错误的上下文?
可以说我疯了,但我希望所有JavaScript错误在抛出时都能暴露Javascript 是否可以修改错误';使其包含引发错误的上下文?,javascript,node.js,error-handling,Javascript,Node.js,Error Handling,可以说我疯了,但我希望所有JavaScript错误在抛出时都能暴露此的上下文。很难用英语解释,更容易用代码解释我想要什么: var Person = function() { this.name = 'Chuck'; } Person.prototype.speak = function() { throw new Error('muted!'); console.log('My name is', this.name); } var person = new Per
此
的上下文。很难用英语解释,更容易用代码解释我想要什么:
var Person = function() {
this.name = 'Chuck';
}
Person.prototype.speak = function() {
throw new Error('muted!');
console.log('My name is', this.name);
}
var person = new Person();
try {
person.speak();
}
catch(error) {
console.log(error.context.name, 'could not speak.');
}
我是否可以自动填充error.context
属性,以便上面的代码可以工作?我乐于接受任何疯狂的技巧,并使用下一版本的JavaScript或node.js
编辑:我希望在不使用自定义错误的情况下执行此操作。通过这种方式,我可以捕获任何非自定义错误,并且仍然可以访问
上下文,只需在抛出错误之前将属性附加到错误(可能会用一个漂亮的函数包装它):
可能的帮助函数:
function ContextifiedError (message, context) {
var err = new Error(message);
err.context = context;
return err;
}
然后你抛出ContextifiedError('something',this)
编辑:正如@BenjaminGruenbaum所指出的,当使用辅助对象时,堆栈跟踪被关闭一次。如果您愿意,您可以写出更长但更正确的助手:
function ContextifiedError (message, context) {
this.context = context;
this.type = 'ContextifiedError';
Error.call(this, message);
if (Error.captureStackTrace) {
Error.captureStackTrace(this, this.constructor);
}
}
ContextifiedError.prototype = Error.prototype;
ContextifiedError.prototype.constructor = ContextifiedError;
Error.call
用于调用我们自己的“父构造函数”Error.captureStackTrace
,在现代浏览器上,确保我们拥有正确的.stack
属性(请参阅以获取解释)。剩下的就是样板
然后,您可以抛出新的ContextifiedError('something',this)
在抛出错误之前,只需将属性附加到错误(可能会用一个漂亮的函数包装它):
可能的帮助函数:
function ContextifiedError (message, context) {
var err = new Error(message);
err.context = context;
return err;
}
然后你抛出ContextifiedError('something',this)
编辑:正如@BenjaminGruenbaum所指出的,当使用辅助对象时,堆栈跟踪被关闭一次。如果您愿意,您可以写出更长但更正确的助手:
function ContextifiedError (message, context) {
this.context = context;
this.type = 'ContextifiedError';
Error.call(this, message);
if (Error.captureStackTrace) {
Error.captureStackTrace(this, this.constructor);
}
}
ContextifiedError.prototype = Error.prototype;
ContextifiedError.prototype.constructor = ContextifiedError;
Error.call
用于调用我们自己的“父构造函数”Error.captureStackTrace
,在现代浏览器上,确保我们拥有正确的.stack
属性(请参阅以获取解释)。剩下的就是样板
然后您可以抛出新的ContextifiedError('something',this)
您可以创建自己的自定义错误构造函数,它接受一个参数来填充上下文
属性。然后在您的代码中,类似于抛出新的CustomError(这是“muted!”)
您可以创建自己的自定义错误构造函数,它接受一个参数来填充上下文
属性。然后在您的代码中,类似于抛出新的CustomError(这是“muted!”)
您在构造函数中创建新错误
的事实意味着您捕获了错误的堆栈跟踪(太低一级),可能需要修复它。@BenjaminGruenbaum对此表示感谢,已修改。您在构造函数中创建新错误
的事实意味着您捕获了错误的堆栈跟踪(太低一级),“我可能想解决这个问题。”本贾明鲁恩鲍姆对此表示感谢,修正。