是否可以在PostError中确定调用方法名称“Eat Pizza”? 我想我可以将“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
答案 0 :(得分: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());
答案 1 :(得分:2)
是否可以在PostError中确定调用方法名称“Eat Pizza”?我想我可以将“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;
//...
}