我想以某种方式找出哪个CFC正在调用我的方法。
我有一个记录CFC,由许多不同的CFC调用。在此日志记录CFC上,需要存储要求日志的CFC。
虽然我可以简单地将CFC名称作为参数传递给我的log.cfc,但我发现这是一个重复的任务,如果我能以某种方式找出“谁在”日志上调用该方法,那么可能没有必要。 CFC
是否有任何程序化的方法来实现这一目标?
提前致谢
答案 0 :(得分:9)
更新:正如Richard Tingle's answer指出的那样,因为CF10你可以使用CallStackGet(),这比抛出虚拟异常更好。
原始回答:最简单的方法是抛出一个虚拟异常并立即捕获它。但这有一个缺点,就是在调试输出中显示一个虚拟异常。对我来说,这是一个交易破坏者,所以我写了下面的代码(基于this code on 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()
});
}
}
答案 1 :(得分:4)
从ColdFusion 10现在可以执行此功能callStackGet()
例如,以下代码将堆栈跟踪转储到D:/web/cfdump.txt
<cfdump var="#callStackGet()#" output="D:/web/cfdump.txt">
答案 2 :(得分:1)
一种方法是抛出/捕获自定义错误并解析堆栈跟踪。以下是一些例子
答案 3 :(得分:0)