查找调用方法的来源

11

我希望能够找出哪个CFC调用了我的方法。

我有一个日志记录的CFC,被许多不同的CFC所调用。在这个日志记录的CFC中,需要存储调用日志的CFC。

虽然我可以简单地将CFC名称作为参数传递给我的log.cfc,但我觉得这是一项重复的任务,如果我可以找出“谁”在调用log.cfc上的方法,这可能是不必要的。

是否有程序化的方法实现这一点?

提前致谢。

4个回答

9
更新: 正如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()
    });
  }
}

那是一种非常优雅的方式。谢谢你。 - Marcos Placona
你的链接已经失效了。今天我搜索 CFLib 时,发现有一个使用 throwables 操作的 UDF:https://cflib.org/udf/getStackTrace。使用 currentThread().getStackTrace() 似乎是一种非常干净的方法。 - Bernhard Döbler
@BernhardDöbler 自CF10以来,您可以直接使用CallStackGet()函数 https://helpx.adobe.com/coldfusion/cfml-reference/coldfusion-functions/functions-c-d/CallStackGet.html - Kip
@Kip。谢谢,我知道CallStackGet()。我只是需要处理CF9遗留代码并希望保持CF9兼容性,因此正在寻找CF9版本。 - Bernhard Döbler

4

从 ColdFusion 10 开始,现在有一个可以执行此操作的函数 callStackGet()

例如,以下代码将转储堆栈跟踪到 D:/web/cfdump.txt

<cfdump var="#callStackGet()#" output="D:/web/cfdump.txt">


0

我不知道有没有直接做你所要求的方法,也许其他人知道。

然而,我相信你可以获取堆栈跟踪并创建一个函数来解析最后的方法调用。

这个函数在cflib上将为您获取堆栈跟踪。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接