我正在尝试构建自定义错误/警告处理程序,当一些特殊断言失败时会给我发送电子邮件,简单的类
function MailError(message, context){
MailApp.sendEmail(...
}
这样我就可以检查哪里出错了。如果把堆栈跟踪也放在那里就好了,这样我就可以看到它发生的确切位置,而且我不必每次在第二个上下文参数中都传递一些标记。
在javascript中,我们可以使用console.log来获取堆栈跟踪,例如
(function tracer() { console.trace()}) ()
会产生类似
的内容console.trace
tracer @ js:12
在apps脚本中,这将给
Exception: ScriptError TypeError: console.trace is not a function
,因为它显然没有实现。此外,它在控制台上打印,而我需要它在变量中通过电子邮件发送给我。
任何方法获得堆栈跟踪变量,在V8运行时?
发现一些使用throw/catch的解决方案,看起来有点奇怪,但似乎工作得很好
function MailError(message){
try {
throw new Error(message)
} catch(e) {
MailApp.sendEmail(MY_EMAIL, "[Error] " + message, e.stack)
}
}
//with some formatting and indentation
//strip off the first few lines using .splice(n) after split
const __getStackTrace__ = function(message) {
let s = `Error: ${message}n`;
(new Error()).stack
.split('n')
.forEach((token)=>
{s += `t${token.trim()}n`}
);
return s;
}
}