我正在尝试构建自定义错误/警告处理程序,当某些特殊断言失败时,它会向我发送电子邮件,简单的类
function MailError(message, context){
MailApp.sendEmail(...
}
这样我就可以检查那里出了什么问题。如果将堆栈跟踪也放在那里,那就太好了,这样我就可以看到它发生的确切行,而且我不必每次都在第二个context参数中传递一些关于此的标记。
在 javascript 中,我们可以使用 console.log 获取堆栈跟踪,例如
(function tracer() { console.trace()}) ()
会产生类似的东西
console.trace
tracer @ js:12
在应用程序脚本中,这会给出
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)
}
}
这是一个小脚本,您可以使用它来获取具有一些格式和缩进的堆栈跟踪
分割后使用
.splice(n)
去掉前几行
const getStackTrace = function(error) {
let s = `Error: ${error.message}\n`;
error.stack
.split('\n')
.forEach((token) => s += `\t${token.trim()}\n`);
return s;
}
try {
throw new Error("OOPSIES!")
} catch (error) {
const errorStack = getStackTrace(error)
console.log(errorStack)
}