Methods 找到谁';他正在调用这个方法

Methods 找到谁';他正在调用这个方法,methods,coldfusion,cfc,Methods,Coldfusion,Cfc,我想找出哪个CFC在调用我的方法 我有一个日志CFC,它被许多不同的CFC称为。在这个日志CFC上,需要存储哪个CFC调用日志 虽然我可以简单地将CFC名称作为参数传递给我的log.CFC,但我发现这是一项重复的任务,如果我能找到“谁”在log.CFC上调用该方法,这可能是不必要的 有什么计划性的方法来实现这一点吗 提前感谢一个棘手的方法是抛出/捕获自定义错误并解析堆栈跟踪。这里有一些例子 我不知道有什么方法可以直接满足你的要求,也许其他人可以 但是,我相信您可以获得堆栈跟踪并创建一个函数

我想找出哪个CFC在调用我的方法

我有一个日志CFC,它被许多不同的CFC称为。在这个日志CFC上,需要存储哪个CFC调用日志

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

有什么计划性的方法来实现这一点吗


提前感谢

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


我不知道有什么方法可以直接满足你的要求,也许其他人可以

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


在cflib上,将获得堆栈跟踪

更新:正如所指出的,由于可以使用CF10,这比抛出一个伪异常要好


原始答案:最简单的方法是抛出一个虚拟异常并立即捕获它。但这样做的缺点是在调试输出中显示虚拟异常。对我来说,这是一个交易破坏者,所以我写了以下代码(基于)。我想创建一个类似于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
时,我发现一个UDF使用一次性文件进行操作:。使用
currentThread()。谢谢,我知道CallStackGet()。我只需要处理CF9遗留代码,并希望保持CF9兼容性,因此希望使用CF9版本。