【问题标题】:Exception not being caught异常未被捕获
【发布时间】:2011-09-08 13:16:01
【问题描述】:

我有一个非常简单的应用程序,我们向它提供我们网站的列表,它对它们执行并行 foreach,并且在每个操作中它都会向它发送一个 http post。

类似于下面:

static int success = 0
static void Main(string[] args) {
    try {
        Parallel.ForEach(sites, site=> {
            try{
                if(DoWebPost(site)) {
                    Console.Write("Posted {0} - {1}", ++success, site);
                }
            } catch {}
        });
    } catch {}
}

我不知道为什么它会抛出 OutOfMemoryException,更不用说为什么这会导致整个应用程序崩溃,而不仅仅是捕获并继续。

编辑:不完全确定异常发生的位置,因为它不在本地,仅在生产中运行时...意味着没有可用的调试。该应用程序是 64 位的,很少使用超过 100 兆。

【问题讨论】:

  • 有些异常是无法捕获的。 (如果我没记错的话,它们会被捕获并自动重新抛出,机制是运行时在第一次抛出异常时设置一个特定的标志,表明它应该被重新抛出)。托管内存不足就是其中之一。
  • 如果出现内存不足错误,您希望如何继续?
  • 如果内存不足,运行时该怎么办?捕获异常有什么帮助?您仍然内存不足,因此应用程序崩溃了...
  • 与异常无关,但你应该使用Interlocked.Increment来增加来自不同线程的静态变量。
  • 为 AppDomain.Current.UnhandledException 实现事件处理程序并记录或显示 e.ExceptionObject.ToString() 的值。如果这对诊断没有帮助,请在此处发布。

标签: c# exception-handling out-of-memory parallel-extensions


【解决方案1】:

words of Marc Gravell

如果你通过处理这个异常来“修复”你的代码,你就是在埋头苦干。

【讨论】:

    【解决方案2】:

    您提到发布的代码与您使用的代码有些相同。 您是否可以实际发布完整的代码或导致此问题的确切代码。 有些东西告诉我你有某种内存泄漏,你需要先解决这个问题。

    【讨论】:

    • 很遗憾没有,而且它不是每次都这样做,即使在相同的参数下也是如此。我所做的只是重新运行应用程序,它可以工作,但我不想照看它。
    猜你喜欢
    • 1970-01-01
    • 2016-05-09
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 2012-05-31
    相关资源
    最近更新 更多