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

可以说我疯了,但我希望所有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 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对此表示感谢,已修改。您在构造函数中创建
新错误
的事实意味着您捕获了错误的堆栈跟踪(太低一级),“我可能想解决这个问题。”本贾明鲁恩鲍姆对此表示感谢,修正。