为什么这会终止我的应用而不会抛出异常?

时间:2013-05-01 22:30:59

标签: c# .net

我正在使用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。但我的捕获声明没有抓住它。

会导致完全死亡的原因是什么?我该如何防范呢?

2 个答案:

答案 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以供参考),因为很少有这种严重错误可以恢复。

编辑:或者您正在序列化的课程出错。你传入的对象中是否有循环引用?