【发布时间】:2013-04-18 13:40:35
【问题描述】:
当我在 ExtendScript 中发现错误时,我希望能够记录其堆栈跟踪。 ExtendScript 中的错误似乎不包含堆栈跟踪,所以我正在尝试将堆栈跟踪添加到错误的想法。
我知道获取堆栈跟踪的唯一方法是$.stack。 $.stack 字段包含您访问该字段时的当前堆栈跟踪。
我的第一次尝试是创建自己的包含堆栈的错误对象。 Error 对象非常特殊,因为它可以获取创建它的代码的行和文件名。例如,
try {
throw new Error("Houston, we have a problem.");
}
catch (e) {
$.writeln("Line: " + e.line);
$.writeln("File: " + e.fileName);
$.writeln("Message: " + e.message);
}
将打印:
Line: 2
File: ~/Desktop/Source1.jsx
Message: Houston, we have a problem.
我认为用这种能力创建自己的对象是不可能的。我能得到的最接近的是:
function MyError(msg, file, line) {
this.message = msg;
this.fileName = file;
this.line = line;
this.stack = $.stack;
}
try {
throw new MyError("Houston, we have a problem.", $.fileName, $.line);
}
catch (e) {
$.writeln("Line: " + e.line);
$.writeln("File: " + e.fileName);
$.writeln("Message: " + e.message);
$.writeln("Stack: " + e.stack);
}
哪些打印:
Line: 9
File: ~/Desktop/Source2.jsx
Message: Houston, we have a problem.
Stack: [Source3.jsx]
MyError("Houston, we have a p"...,"~/Desktop/Source2.js"...,9)
在这里我们可以看到我正在创建自己的错误对象,并显式地将行和文件名传递给它(因为 MyError 无法自行判断)。创建错误时,我还包含了当前堆栈。
当我调用我自己的错误对象时这工作正常,但当其他代码调用常规错误对象或自动生成错误时(例如通过非法访问)它不起作用。我希望能够获得任何错误的堆栈跟踪,无论它是如何生成的。
其他方法可能是修改Error 的构造函数,修改Error 的原型,或者完全替换Error 对象。我无法让这些方法中的任何一种发挥作用。
另一个想法是在我的代码的每个方法中放置一个 catch 块,如果当前堆栈还没有,则将其添加到错误中。如果可能的话,我想避免这个选项。
我没有想法。有什么方法可以获取错误的堆栈跟踪吗?
【问题讨论】:
-
如果你能得到一些工作,我会很感兴趣。我最大的问题是,一旦我编译成 jsxbin 格式,我就不会从错误中得到任何有用的信息。我已经完成了大量日志记录,因此我可以从中进行调试。
-
我个人不会使用 $.write 或 $.writeln 指令。首先,如果您没有打开,他们会预先提供 ExtendScript Toolkit。如果他们没有得到警告,那可能会让最终用户感到困惑。此外,它可能真的很慢,尤其是在循环内部。我更喜欢将日志文件写入磁盘。我有我自己的食谱,但你可以利用这个库:creative-scripts.com/logging-with-a-smile
标签: adobe adobe-indesign extendscript indesign-server