找出谁在调用方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了找出谁在调用方法相关的知识,希望对你有一定的参考价值。

我想以某种方式找出哪个CFC正在调用我的方法。

我有一个记录CFC,由许多不同的CFC调用。在此日志记录CFC上,需要存储调用日志的CFC。

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

有没有任何程序化的方法来实现这一目标?

提前致谢

答案

更新:正如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()
    });
  }
}
另一答案

从ColdFusion 10现在有一个功能来做这个callStackGet()

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

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

一种方法是抛出/捕获自定义错误并解析堆栈跟踪。这里有些例子

另一答案

我不知道有什么方法可以直接做你所问的问题,也许是其他人做的。

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

cflib上的This function将为您提供堆栈跟踪。

以上是关于找出谁在调用方法的主要内容,如果未能解决你的问题,请参考以下文章

如何找出谁在托管我的 Wordpress 网站? [关闭]

找出谁在遍历游戏中获胜的算法

谁在驱动程序代码中调用“探针”功能?

在 GDB 中,如何找出谁在堆上分配了地址?

找出当前显示的片段是啥的最佳方法是啥?

Java 安全管理器找出谁请求访问