3

我正在使用 YAX 序列化程序(当前的 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。但我的 catch 语句没有抓住它。

什么会导致这样的完全死亡?我该如何防范?

4

2 回答 2

6

Stackoverflow 异常在 CLR > 2.0 中的“可捕获性”有限。有关详细信息,请参阅下面的博客文章;您遇到的行为正是所描述的。

请参阅:http: //blogs.msdn.com/b/jaredpar/archive/2008/10/22/when-can-you-catch-a-stackoverflowexception.aspx

虽然很烦人,但这确实是有道理的:如果你的堆栈崩溃了,那么一致/安全/理智的恢复会是什么样子?

于 2013-05-01T22:34:56.437 回答
2

似乎是一个严重的错误YAXSerializer

StackOverflowException无法被捕获(请参阅此处以供参考),因为很少有从如此严重的错误中恢复。

编辑:或者这是您正在序列化的类的错误。您传入的对象中是否有循环引用?

于 2013-05-01T22:35:49.563 回答