考虑以下代码:
[GlobalErrorBehaviorAttribute(typeof(GlobalErrorHandler))]
public class Service1 : IService1
{
public string Recursive(int value)
{
Recursive(value);
return string.Format("You entered: {0}", value);
}
这是我的GlobalErrorHandler
:
public class GlobalErrorHandler : IErrorHandler
{
public bool HandleError(Exception error)
{
string path = HostingEnvironment.ApplicationPhysicalPath;
using (TextWriter tw = File.AppendText(Path.Combine(path, @"d:\\IIS.Log")))
{
if (error != null)
{
tw.WriteLine("Exception:{0}{1}Method: {2}{3}Message:{4}",
error.GetType().Name, Environment.NewLine, error.TargetSite.Name,
Environment.NewLine, error.Message + Environment.NewLine);
}
tw.Close();
}
return true;
}
public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
var newEx = new FaultException(
string.Format("Exception caught at GlobalErrorHandler{0}Method: {1}{2}Message:{3}",
Environment.NewLine, error.TargetSite.Name, Environment.NewLine, error.Message));
MessageFault msgFault = newEx.CreateMessageFault();
fault = Message.CreateMessage(version, msgFault, newEx.Action);
}
}
当我在WCF测试客户端中调用Recursive
时,出现此错误。为什么我无法处理StackOverflowException
?
有没有办法处理这样的错误?
答案 0 :(得分:1)
根据MSDN:
从.NET Framework 2.0开始,您无法使用try / catch块捕获StackOverflowException对象,并且默认情况下会终止相应的进程。因此,您应该编写代码来检测并防止堆栈溢出。
在这种情况下,这意味着你应该主动阻止异常,通过传入整数检查深度是否变低并自己抛出异常,如下所示:
public string Recursive(int value, int counter)
{
if (counter > MAX_RECURSION_LEVEL) throw new Exception("Too bad!");
Recursive(value, counter + 1);
return string.Format("You entered: {0}", value);
}
或者重写算法以使用tail recursion。