Javascript 如何减少抛出错误时的堆栈跟踪(指向调用站点)

Javascript 如何减少抛出错误时的堆栈跟踪(指向调用站点),javascript,node.js,exception,stack-trace,Javascript,Node.js,Exception,Stack Trace,我有这样一个函数: function foo() { throw new Error('`foo` has been removed in favor of `bar`') } 当有人调用foo时,我希望堆栈跟踪(错误输出)指向foo的调用位置,而不是foo内部的throw行 例如,我得到了这个: $ node test.js /home/ubuntu/tmp/test.js:2 throw new Error('`foo` has been removed in favor of

我有这样一个函数:

function foo() {
  throw new Error('`foo` has been removed in favor of `bar`')
}
当有人调用
foo
时,我希望堆栈跟踪(错误输出)指向
foo
的调用位置,而不是
foo
内部的
throw

例如,我得到了这个:

$ node test.js

/home/ubuntu/tmp/test.js:2
  throw new Error('`foo` has been removed in favor of `bar`')
        ^
Error: `foo` has been removed in favor of `bar`
    at foo (/home/ubuntu/tmp/test.js:2:9)
    at Object.<anonymous> (/home/ubuntu/tmp/test.js:5:1)
    ...
$node test.js
/home/ubuntu/tmp/test.js:2
抛出新错误('foo'已被删除,取而代之的是'bar')
^
错误:`foo`已被删除,取而代之的是`bar'`
在foo(/home/ubuntu/tmp/test.js:2:9)
反对。(/home/ubuntu/tmp/test.js:5:1)
...
我该如何取而代之

$ node test.js

/home/ubuntu/tmp/test.js:5
  foo()
  ^
Error: `foo` has been removed in favor of `bar`
    at Object.<anonymous> (/home/ubuntu/tmp/test.js:5:1)
    ...
$node test.js
/home/ubuntu/tmp/test.js:5
foo()
^
错误:`foo`已被删除,取而代之的是`bar'`
反对。(/home/ubuntu/tmp/test.js:5:1)
...

步骤1:定义自定义错误对象。有关详细信息:

步骤2:使用
捕获未捕获的错误。

function foo() {
  throw new CustomError('`foo` has been removed in favorof `bar`');
};

var d = require('domain').create();

d.on('error', function(err) {
    /*
     * customize the output here.
     */
});

d.run(function() {
  foo();
});
步骤3:自定义输出。结构化堆栈跟踪是一个CallSite对象数组,每个对象代表一个堆栈帧。CallSite对象定义了


如果您的目标是函数名匿名,那么这可能是错误的方法。但这就是您抛出错误的地方…请注意,只有节点才会这样做。相关:节点将这两行添加到输出中的代码。
function foo() {
  throw new CustomError('`foo` has been removed in favorof `bar`');
};

var d = require('domain').create();

d.on('error', function(err) {
    /*
     * customize the output here.
     */
});

d.run(function() {
  foo();
});
  for(var index=0; index<err.stack.length; index++){
    var frame = err.stack[index];

    var unit = frame.getFunctionName() || frame.getMethodName();
    if (unit === null) {
      unit = 'function()';
    } else {
      unit += '()'
    }

    if (index === 0) {
      console.error('%s:%d:%d\n  %s\n  ^',
        frame.getFileName(),
        frame.getLineNumber(),
        frame.getColumnNumber(),
        unit);

      console.error('Error: ' + err.message);

    } else {
      console.error('    at %s (%s:%d:%d)',
        unit,
        frame.getFileName(),
        frame.getLineNumber(),
        frame.getColumnNumber());
    };
  }; // END. stack trace
/home/ray/dev/test/error.js:57:9
  foo()
  ^
Error: `foo` has been removed in favorof `bar`
    at function() (/home/ray/dev/test/error.js:53:3)
    at b() (domain.js:183:18)
    at Domain.run() (domain.js:123:23)
    at function() (/home/ray/dev/test/error.js:52:3)
    at Module._compile() (module.js:456:26)
    at Module._extensions..js() (module.js:474:10)
    at Module.load() (module.js:356:32)
    at Module._load() (module.js:312:12)
    at Module.runMain() (module.js:497:10)