11

どのCFCが私のメソッドを呼び出しているのかをどうにかして調べたいのですが。

私は多くの異なるCFCによって呼び出されるロギングCFCを持っています。このロギングCFCには、どのCFCがログを要求したかを保存する必要があります。

log.cfcへの引数としてCFC名を渡すことはできますが、これは反復的なタスクであることがわかります。log.cfcでメソッドを呼び出している「誰が」を見つけることができれば、これは必要ないかもしれません。

これを達成するためのプログラム的な方法はありますか?

前もって感謝します

4

4 に答える 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()
    });
  }
}
于 2011-04-15T19:14:59.367 に答える
4

ColdFusion 10から、これを行う関数が追加されましたcallStackGet()

たとえば、次のコードはスタックトレースをにダンプしますD:/web/cfdump.txt

<cfdump var="#callStackGet()#" output="D:/web/cfdump.txt">
于 2014-11-21T15:59:10.430 に答える
1

厄介な方法の1つは、カスタムエラーをスロー/キャッチし、スタックトレースを解析することです。下記は用例です

于 2010-04-20T13:40:16.677 に答える
0

私はあなたが求めていることを直接行う方法を知りません、多分他の誰かがします。

ただし、スタックトレースを取得して、最後のメソッド呼び出しを解析する関数を作成できると思います。

cflibのこの関数は、スタックトレースを取得します。

于 2010-04-20T13:43:48.170 に答える