Найти, кто вызывает метод - PullRequest
10 голосов
/ 20 апреля 2010

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

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

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

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

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

Ответы [ 4 ]

9 голосов
/ 15 апреля 2011

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

В ColdFusion 10 теперь есть функция для этого callStackGet()

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

<cfdump var="#callStackGet()#" output="D:/web/cfdump.txt">
1 голос
/ 20 апреля 2010

Один хитрый способ - генерировать / перехватывать пользовательскую ошибку и анализировать трассировку стека. Вот несколько примеров

0 голосов
/ 20 апреля 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...