我正在使用YAX Serializer(当前的NuGet版本)。当我运行此代码时:
void Main()
{
try
{
int zero = 0;
int result = 100 / zero;
}
catch (DivideByZeroException ex)
{
LogSaveException(ex);
}
}
public void LogSaveException(object value)
{
try
{
YAXSerializer serializer = new YAXSerializer(value.GetType());
string loggedString = serializer.Serialize(value);
Console.WriteLine(loggedString);
}
catch (StackOverflowException)
{
Console.WriteLine("Log Error", "Could Not Log object of type "
+ value.GetType().ToString() +" due to stack overflow.");
}
catch (Exception)
{
Console.WriteLine("Log Error", "Could Not Log object of type "
+ value.GetType().ToString());
}
}
应用程序在此行结束:string loggedString = serializer.Serialize(value);
我试图抓住任何可以看到的异常。但该应用程序刚刚结束。
我尝试在LinqPad中运行它,它崩溃了LinqPad。我试图调试LinqPad的崩溃(即使我没有源代码,有时你可以从中获取一些信息。)当我这样做时它说有一个StackOverflowException。但我的捕获声明没有抓住它。
会导致完全死亡的原因是什么?我该如何防范呢?
答案 0 :(得分:6)
Stackoverflow异常限制了CLR中的“可捕获性”> 2.0。有关详细信息,请参阅下面的博客文章;你正在经历的行为正如所描述的那样。
请参阅:http://blogs.msdn.com/b/jaredpar/archive/2008/10/22/when-can-you-catch-a-stackoverflowexception.aspx
虽然令人讨厌,但这确实有道理:如果你已经炸掉你的堆栈,那么一致/安全/理智的恢复会是什么样的?
答案 1 :(得分:2)
似乎是YAXSerializer
的严重错误。
StackOverflowException
无法被捕获(请参阅here以供参考),因为很少有这种严重错误可以恢复。
编辑:或者您正在序列化的课程出错。你传入的对象中是否有循环引用?