【问题标题】:.net c# exception handling fails in 64 bit mode.net c# 异常处理在 64 位模式下失败
【发布时间】:2013-06-15 22:43:43
【问题描述】:

我的 c# webservice 应用程序遇到问题。异常不再在某个时刻处理。应用程序只是停止而没有任何进一步的消息/故障异常。这就是发生的事情:

问题:

  • 在方法的 catch 部分中,我抛出了一个新异常,其中包含 有关例外情况的其他信息;
  • 底层异常来自我的应用程序的另一部分; 异常的“堆栈”约为 20,但这似乎不是 这里有个问题;
  • 在使用 VS2012 开发服务器(我假设是 32 位)或 32 位模式下的 IIS 时,调用方法会按预期拾取抛出的异常(最终导致我的 web 服务的 FaultException)

到目前为止我已采取的步骤或其他可能有用的信息:

  • 我可以轻松重现异常;它只是停止工作 每次我运行我的代码时都完全相同。不幸的是我的 项目太大/太复杂,无法在此处展示。
  • 起初我认为一方面是 VS2012 开发服务器与另一方面是 IIS 之间的差异导致了我的问题。 但是,当我在 IIS 中将我的应用程序池配置为 32 位时, 一切正常。迁移到 64 位会导致此行为。
  • 内存使用似乎不是问题;在我的应用程序中,我使用(大)xml 输入文件。对这些文件(大小)的更改没有 影响我的问题。
  • 我尝试使用为 Web 服务提供的诊断工具。这些并没有真正帮助我,因为我可以看到会发生什么(或者我应该说 不会发生)在 VS2012 中调试我的应用程序时;

它来了! 我的原始代码如下所示:

try
{
  //some code here throws an exception
}
catch (Exception ex)
{
  throw new Exception("some message", ex); //after this line no activity anymore
}

当我将其更改为:

Exception myex = null;
try
{
  //some code here throws an exception
}
catch (Exception ex)
{
  myex = new Exception("some message", ex);
  return null;
}
finally
{
  if (myex!=null) throw myex;
}

我的问题解决了!?有人对这种行为有解释吗?我希望依靠正常的异常处理机制。

另外一句话: 当我在 try{} 部分之前放置一个“throw new Exception()”时,我的代码也运行良好(当然,我不希望这样)。

有人知道吗?提前致谢!

【问题讨论】:

  • 你能用一个简短但完整的控制台应用程序重现这个吗?您说您可以在您的应用程序中重现它 - 在您的应用程序的上下文中重现它not 并且在网络服务中重现它not 会非常有帮助。
  • @dirk - 可以在 应用程序简单地停止而没有任何进一步的消息/故障异常 上进行说明吗?那时你可以在调试器中看到什么?
  • @Henk Holterman - 什么都没有。我只能按 VS 中的“停止”按钮。就这样。 EventViewer 中也没有任何内容。而且(显然),网络服务停止响应(我正在使用 SoapUI 对其进行测试)。
  • 除非访问您的环境,否则无法说出原因。我猜应该是 IIS 上的 64 位模块吃异常。如果您熟悉 WinDbg + SOS,您可以对其进行实时调试。要从专家那里获得一些帮助,您可以通过support.microsoft.com 打开支持案例以咨询 Microsoft。
  • 我有兴趣查看可疑代码生成的 IL。

标签: c# .net exception-handling 32bit-64bit


【解决方案1】:

您是从后台工作人员运行此程序吗? 我认为您可能会在第一段代码中遇到线程锁定问题,但是返回 null 允许线程在您的第二段代码中完成。

我已经看到了一些错误,这些错误使用 MessageBox.Show() 命令将允许代码正常工作。

【讨论】:

    【解决方案2】:

    此问题可能与平台本身有关。您可以向微软Connect 举报,希望您能尽快得到答复。

    【讨论】:

      【解决方案3】:

      您的项目中是否有任何引用程序集是 32 位偶然并在该方法的范围内引用的?如果是这样,那将是一个很好的例子,说明为什么在 64 中运行会导致未定义的行为。我之前在另一个项目中被这个问题所困扰,并且出现了神秘的应用程序崩溃。

      【讨论】:

        【解决方案4】:

        当使用 64 位机器时,我在 VS2012 中看到了类似的行为,通过将平台显式设置为 x64(而不是“任何 CPU”)以及禁用(取消选中) 任何“启用的调试器”。我无法解释为什么这些黑客会奏效。

        您可以在 Menu:Build->Configuration Manager ...中创建一个新的“活动解决方案平台”。

        调试设置可以在 Menu:Project->proj properties 中找到。

        我很想知道为什么它有效,或者其他人是否找到了类似的解决方法来解决围绕异常的无法解释的行为问题。

        【讨论】:

          猜你喜欢
          • 2010-12-18
          • 1970-01-01
          • 2013-01-10
          • 1970-01-01
          • 2011-02-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多