什么时候尝试捕获不是尝试捕获?

时间:2010-04-17 23:16:46

标签: c# exception

我有一个有趣的问题,在应用程序关闭期间,try / catch块似乎在堆栈中被忽略。

我没有工作测试项目(但是由于截止日期,否则我会完全尝试重新编写),但请考虑以下代码段。

class IndexNotFoundException : Exception { }

public static string RunAndPossiblyThrow(int index, bool doThrow)
{
    try
    {
        return Run(index);
    }
    catch(IndexNotFoundException e)
    {
         if(doThrow)
             throw;
    }
    return "";
}

public static string Run(int index)
{
    if(_store.Contains(index))
        return _store[index];
    throw new IndexNotFoundException ();
}

public static string RunAndIgnoreThrow(int index)
{
    try
    {
        return Run(index);
    }
    catch(IndexNotFoundException e)
    {
    }
    return "";
}

在运行期间,此模式非常有用。我们得到了对依赖程序控制异常(坏)的代码的遗留支持,我们可以继续前进并慢慢删除用于程序控制的异常。

然而,当关闭我们的UI时,我们看到从“运行”抛出的异常,即使“doThrow”对于“RunAndPossiblyThrow”的所有当前使用都是假的。我甚至通过修改代码看起来像“RunAndIgnoreThrow”来验证这一点,我仍然会在UI关闭后崩溃。

先生。 Eric Lippert,我每天都在阅读你的博客,我很乐意听到它是一些已知的bug,我不会发疯。

EDIT 这是多线程的,我已经验证所有对象在被访问时都没有被修改

EDIT 明确显示异常是我们的

EDIT 忘了提,这是关闭,不幸的是视觉工作室无法直接赶上崩溃。它可能会崩溃在UI线程以外的线程上,一旦主要关闭,它就会关闭。我只能通过反复运行&关闭应用程序,打开任务管理器,“创建转储文件”,然后查看Windbg中产生的400 + mb混乱。 Win7 64供参考。确保这对你有意义。

修改

关闭时的以下代码仍显示相同的异常。

class IndexNotFoundException : Exception { }

public static string RunAndPossiblyThrow(int index, bool doThrow)
{
    try
    {
        return Run(index);
    }
    catch
    {
    }
    return "";
}

public static string Run(int index)
{
    if(_store.Contains(index))
        return _store[index];
    throw new IndexNotFoundException ();
}

唯一似乎摆脱异常的是直接进入

class IndexNotFoundException : Exception { }

public static string RunAndPossiblyThrow(int index, bool doThrow)
{
    try
    {
        return Run(index);
    }
    catch
    {
    }
    return "";
}

public static string Run(int index)
{
    if(_store.Contains(index))
        return _store[index];
    return "";
}

当然,例外情况已经消失,但我对疯狂的恐惧仍然存在。

修改

它变得更糟......这仍然会崩溃......

class IndexNotFoundException : Exception { }

public static string RunAndPossiblyThrow(int index, bool doThrow)
{
    try
    {
        throw new IndexNotFoundException();
    }
    catch
    {
    }
    return "";
}

EDIT 我有一种明显的感觉,这会让我无处可去。除了奇怪的行为之外,我还可以注意到在上述情况下执行UI期间,try catch正在忠实执行。我的用户界面没有崩溃&它充满了空字符串。但是,一旦我开始关闭UI,崩溃就会显示出来并且try catch不再阻止异常。

编辑&最后 显然,转储文件在其中列出了最新的第一次机会异常。我通过创建一个新的项目来验证这一点,该项目在try catch&睡了10秒钟。在等待期间,我得到了.dmp文件&果然,我完全被抓住的异常出现了。

我会为有用的答案标记一些要点,但不幸的是,我的代码崩溃仍然没有押韵或原因......

5 个答案:

答案 0 :(得分:4)

添加一个Exception作为额外的catch。我认为你得到了一些除ApplicationException之外的其他异常,那就是崩溃你的应用程序。

答案 1 :(得分:3)

有各种例外情况无法捕获。特别是Stack Overflow!其中一个可能出现在你的代码中吗?

请参阅http://www.bluebytesoftware.com/blog/PermaLink,guid,223970c3-e1cc-4b09-9d61-99e8c5fae470.aspx

答案 2 :(得分:0)

您是否尝试过添加“finally”子句?只是为了看看它是否会完全忽略try / catch?理论上,无论如何,它都应该在它退出try / catch之前跳转到该行。

如果它仍然忽略了它,那么肯定会有一些奇怪的东西。

答案 3 :(得分:0)

可能你会抓住并再次从Run中抛出一些其他异常。可能_store是null或者什么。

答案 4 :(得分:0)

可能有助于诊断的一些事项:

  • 注册AppDomain.CurrentDomain.UnhandledException,以便查看某些内容是否在UI线程以外的线程上崩溃

  • 注册Application.ThreadException以捕获未在UI线程中捕获的任何异常

  • 由于这是在关机期间发生的,您是否正在使用可能会在终结器线程上投掷的任何终结器?

相关问题