2

PostErrorで呼び出しメソッド名「Eat Pizza」を特定することはできますか? 引数の 1 つとして "EatPizza" を渡すことができると思いますが、メソッド名が変更されるたびに変更が必要になります (不要なメンテナンス)。しかし、その後、「EatPizza」のコンテキストでメソッド名「EatPizza」を見つけることさえできませんでした (stacktrace、getframe、getmethod を使用)。

public void EatPizza(Pizza p){
    if(p==null){ //A arbitrary made up error
        Utilities.PostError();
    }
    else{
        p.Slices -= 1;
    }
}

...

public void PostError(){
    //Basically posting to database the name of the method
    //Tried this, didn't work: (new StackTrace(true)).GetFrame(5).GetMethod().Name
    //Is it possible to determine the calling method name "Eat Pizza" in this context?
}

StackTrace.GetFrame でさまざまな値 (0 から StackTrace.FrameCount-1) を試すと、「EatPizza」だけが必要なときに次の値が得られます。

.ctor
ThreadStart
Main
_nExecuteAssembly
RunUsersAssemblyDebugInZone
4

2 に答える 2

4

オブジェクトの作成に関しては正しい軌道に乗っていましたStackTraceが、 の引数を誤解しているようですGetFrame。フレームは一番下のフレームから番号が付けられるため、次のようになります。

  • GetFrame(0)戻るだろうPostError
  • GetFrame(1)の呼び出し元を返しますPostError

だからこれを試してみてください:

var trace = new StackTrace(true);
WriteToDB(trace.GetFrame(1).GetMethod().Name);

個人的には、呼び出し元だけでなくスタック トレース全体を取得したいので、次のようにします。

var trace = new StackTrace(true);
WriteToDB(trace.ToString());
于 2011-04-14T17:53:55.480 に答える
2

PostErrorで呼び出しメソッド名「Eat Pizza」を特定することはできますか? 引数の 1 つとして "EatPizza" を渡すことができると思いますが、メソッド名が変更されるたびに変更が必要になります (不要なメンテナンス)。

何か問題が発生する可能性のあるすべてのメソッドで PostError を呼び出すことも、「不要なメンテナンス」です。また、プログラムの実行フローも複雑になります。これは、あらゆる場所でエラーをチェックする必要があり、高レベルのプロセスが低レベルのプロセスが正常に完了したかどうかをチェックする必要があるためです。

CLR および C# によって提供される例外処理構造を使用することをお勧めします。

エラーが発生した正確な場所は、例外の StackTrace プロパティに格納されます。

pubic void BigDinnerEatingProcess()
{
    try
    {
         WhateverHappensAtTheTopLevel();
    }
    catch (PizzaNotDeliveredException ex)
    {
         Utilities.PostError(ex);
         MessageBox.Show("Dinner was not eaten. Please make sure the pizza is delivered.");
    }
}

public void EatPizza(Pizza p)
{
    if (p == null)
        throw new PizzaNotDeliveredException();
    p.RemoveOneSlice();
}

private void PostError(Exception ex)
{
    string errorLocation = ex.StackTrace;
    //...
}
于 2011-04-14T18:05:09.230 に答える