当我在ExtendScript中捕获错误时,希望能够记录它的堆栈跟踪信息。但是,在ExtendScript中,似乎错误并不包含堆栈跟踪信息,因此我正在尝试将堆栈跟踪信息添加到错误中。
目前我所知的唯一获取堆栈跟踪信息的方法是使用
我的第一次尝试是创建一个包含堆栈信息的自定义错误对象。
我认为不可能创建具有此能力的自定义对象。我能做到的最接近的是这个:
```html
在这里,我们可以看到我正在创建自己的错误对象,并明确传递了行和文件名(因为MyError无法自己找出)。当创建错误时,我还包括了当前堆栈。
当我调用自己的错误对象时,这很好用,但是当其他代码调用常规错误对象或自动生成错误时(例如通过非法访问),它就不起作用了。我想能够获取任何错误的堆栈跟踪,无论它如何生成。
其他方法可能是修改“Error”的构造函数、修改“Error”的原型或完全替换“Error”对象。我还没有能够使任何这些方法起作用。
另一个想法是在我的代码的每个单独方法中放置一个catch块,并在错误尚未具有堆栈的情况下将当前堆栈添加到错误中。如果可能的话,我想避免使用此选项。
我已经没有想法了。有没有办法获取错误的堆栈跟踪?
目前我所知的唯一获取堆栈跟踪信息的方法是使用
$.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.
我认为不可能创建具有此能力的自定义对象。我能做到的最接近的是这个:
```html
我不认为可以通过这种方式创建你自己的对象并拥有此能力。我能找到的最相似的方法是:
```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块,并在错误尚未具有堆栈的情况下将当前堆栈添加到错误中。如果可能的话,我想避免使用此选项。
我已经没有想法了。有没有办法获取错误的堆栈跟踪?