我希望能够找出哪个CFC调用了我的方法。
我有一个日志记录的CFC,被许多不同的CFC所调用。在这个日志记录的CFC中,需要存储调用日志的CFC。
虽然我可以简单地将CFC名称作为参数传递给我的log.cfc,但我觉得这是一项重复的任务,如果我可以找出“谁”在调用log.cfc上的方法,这可能是不必要的。
是否有程序化的方法实现这一点?
提前致谢。
我希望能够找出哪个CFC调用了我的方法。
我有一个日志记录的CFC,被许多不同的CFC所调用。在这个日志记录的CFC中,需要存储调用日志的CFC。
虽然我可以简单地将CFC名称作为参数传递给我的log.cfc,但我觉得这是一项重复的任务,如果我可以找出“谁”在调用log.cfc上的方法,这可能是不必要的。
是否有程序化的方法实现这一点?
提前致谢。
原始答案: 最简单的方法是抛出一个虚拟异常并立即捕获它。但是这样做的缺点是会在调试输出中显示一个虚拟异常。对我来说,这是无法接受的,因此我编写了以下代码(基于cflib上的此代码)。我想创建一个类似于cfcatch对象的对象,以便我可以在需要cfcatch对象的地方使用它。
注意: 您可能需要稍微调整此代码才能使其在CF8或更早版本中工作。我认为在CF9之前不支持使用{...}
语法创建对象。
StackTrace = {
Type= 'StackTrace',
Detail= '',
Message= 'This is not a real exception. It is only used to generate debugging information.',
TagContext= ArrayNew(1)
};
j = CreateObject("java","java.lang.Thread").currentThread().getStackTrace();
for (i=1; i LTE ArrayLen(j); i++)
{
if(REFindNoCase("\.cf[cm]$", j[i].getFileName())) {
ArrayAppend(StackTrace.TagContext, {
Line= j[i].getLineNumber(),
Column= 0,
Template= j[i].getFileName()
});
}
}
从 ColdFusion 10 开始,现在有一个可以执行此操作的函数 callStackGet()
例如,以下代码将转储堆栈跟踪到 D:/web/cfdump.txt
<cfdump var="#callStackGet()#" output="D:/web/cfdump.txt">
CFLib
时,发现有一个使用 throwables 操作的 UDF:https://cflib.org/udf/getStackTrace。使用currentThread().getStackTrace()
似乎是一种非常干净的方法。 - Bernhard Döbler