假设我有一种类似的语言
- print "Hello World"
这是透明的
- var $__Helpers = {
- print: function(s) {
- if (typeof s != 'string')
- throw new TypeError('String expected');
- console.log(s);
- }
- };
- $__Helpers.print("Hello World");
如果这种语言的用户是
- print 5
TypeError将由$__ Helpers.print抛出,表示“String expected”.我希望开发人员工具显示打印5行作为此错误的始发调用.我知道如何让我的源地图显示一个看起来像一个调用栈
- transpiled_script.js:2
- original_script.os:1
其中transpiled_script.js:2是调用$__ Helpers.print函数和original_script.os的脚本和行号:1是要打印的调用的脚本和行号5.我想让开发工具忽略最顶层调用transpiled_script.js(这只是我的transpiler的一个实现细节),并且只显示原始脚本的调用(这是它们在自己的脚本中调试的部分).
我显然不能简单地将transpiled_script.js:2映射到original_script.os:1,因为可以在original_script.os中打印多个调用,因此它不是1到1的关系.
有没有办法做到这一点?
(我使用escodegen生成我的源代码和源地图(escodegen使用Node mozilla / source-map模块),所以有一种方法来告诉escodegen或mozilla / source-map来做到这一点是理想的,但是我可以覆盖escodegen的输出,如果这是不可能的.)
解决方法
您可以拆分跟踪并打印所需的行
- var $__Helpers = {
- print: function(s) {
- if (typeof s != 'string'){
- var err = new TypeError('String expected');
- var trace = err.stack.split('\n')
- console.error(trace[0]); // TypeError: string expected
- console.error(trace[2]); // the line who called the function,probably
- //original_script.os:1,or whatever line number the call was from
- //quit the script
- }
- console.log(s);
- } };
编辑:一个更好的解决方案,就是替代跟踪的错误,比扔它,代码现在看起来像这样:
- var $__Helpers = {
- print: function(s) {
- if (typeof s != 'string'){
- var err = new TypeError('String expected: Got'+s);
- err.stack = err.stack.replace(/\n.*transpiled_script\.js.*?\n/g,"\n");
- throw err;
- }
- console.log(s);
- } };