Найти, кто вызывает метод

Я хотел бы как-то узнать, какой CFC вызывает мой метод.

У меня есть журнал CFC, который вызывается многими разными CFC. В этом протоколе CFC необходимо сохранить, какой CFC вызывал журнал.

Пока я мог просто передать имя CFC в качестве аргумента для моего log.cfc, я считаю, что это повторяющаяся задача, которая может не понадобиться, если я каким-то образом узнаю, кто "вызывает" метод в журнале. CFC

Есть ли какой-либо программный способ достижения этого?

Заранее спасибо

Ответ 1

Обновление: Как указывает ответ Ричарда Тингла, начиная с 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()
    });
  }
}

Ответ 2

От ColdFusion 10 теперь есть функция, чтобы сделать это callStackGet()

Например, следующий код сбрасывает трассировку стека на D:/web/cfdump.txt

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

Ответ 4

Я не знаю, как можно напрямую обращаться к тому, что вы просите, может быть, кто-то другой.

Однако я считаю, что вы можете получить трассировку стека и создать функцию для анализа последнего вызова метода.

Эта функция на cflib даст вам трассировку стека.