我有一个递归方法调用。当抛出任何异常时,我希望能看到它发生在递归调用堆栈的哪个位置。我有一个字段,它保存了代表递归堆栈的“路径”。
现在,我想将路径信息添加到可能在递归调用中抛出的任何异常中。
void Recursive(int x)
{
// maintain the recursion path information
path.Push(x);
try
{
// do some stuff and recursively call the method
Recursive(x + 6);
}
catch(Exception ex)
{
if (ex is RecursionException)
{
// The exception is already wrapped
throw;
}
// wrap the exception, this should be done only once.
// save the path and original exception to the wrapper.
throw new RecursionException(path.ToString(), ex);
}
finally
{
// maintain the recursion path information
path.Pop()
}
}
看起来太复杂了。并不只有一种方法。可能有二十甚至更多的地方需要编写这段代码。
有没有更简单的实现方法呢?
编辑:我想要一个简单得多的情况,其中没有这样递归调用该方法的开销,因为我有许多这样的递归调用,不仅有一个方法,还有几个方法互相递归调用,这已经足够复杂了。
所以我想避免整个 try-catch 块,但我找不到任何解决方案。
对于在我的自己的代码中抛出的异常,这不是一个大问题,因为它可能包括从开始到结束的路径。但是对于其他异常,这是一个问题。
编辑:这些异常需要在任何其他代码中被封装,而不仅仅是在调用递归方法时:
try
{
int a = 78 / x; // DivisionByZeroExeption
Recursive(x + 6);
this.NullReference.Add(x); // NullReferenceException
}
所以只包装对Recusive的调用是不起作用的。
有许多这样的方法,具有不同的签名,执行不同的操作,唯一共同的是异常处理。