【问题标题】:Why does this terminate my app without throwing an exception?为什么这会终止我的应用程序而不引发异常?
【发布时间】:2013-05-01 22:30:58
【问题描述】:

我正在使用 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 语句没有捕捉到它。

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

【问题讨论】:

  • 简单。小心递归。

标签: c# .net


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    YAXSerializer 似乎存在严重错误。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-08
      • 1970-01-01
      • 2020-09-30
      • 1970-01-01
      • 2016-12-29
      • 1970-01-01
      • 2017-07-03
      相关资源
      最近更新 更多