我想以某种方式找出哪个 CFC 正在调用我的方法。
我有一个被许多不同的 CFC 调用的日志记录 CFC。在此日志记录 CFC 上,需要存储哪个 CFC 调用了日志。
虽然我可以简单地将 CFC 名称作为参数传递给我的 log.cfc,但我发现这是一项重复性任务,如果我能以某种方式找出“谁”在 log.cfc 上调用该方法,这可能是不必要的
有没有任何程序化的方式来实现这一目标?
提前致谢
我想以某种方式找出哪个 CFC 正在调用我的方法。
我有一个被许多不同的 CFC 调用的日志记录 CFC。在此日志记录 CFC 上,需要存储哪个 CFC 调用了日志。
虽然我可以简单地将 CFC 名称作为参数传递给我的 log.cfc,但我发现这是一项重复性任务,如果我能以某种方式找出“谁”在 log.cfc 上调用该方法,这可能是不必要的
有没有任何程序化的方式来实现这一目标?
提前致谢
更新:正如Richard Tingle 的回答所指出的,从 CF10 开始,您可以使用CallStackGet(),这比抛出虚拟异常要好。
原始答案:最简单的方法是抛出一个虚拟异常并立即捕获它。但这有在调试输出中显示虚拟异常的缺点。对我来说,这是一个交易破坏者,所以我编写了以下代码(基于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">
一种笨拙的方法是抛出/捕获自定义错误并解析堆栈跟踪。这里有些例子