.net c#异常处理在64位模式下失败

时间:2013-06-19 11:56:07

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

我在c#webservice应用程序中遇到问题。异常不再处理某一点。应用程序只需在没有任何进一步的消息/故障异常的情这就是:

问题:

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

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

  • 我可以很容易地重现异常;它只是停止工作 每次运行我的代码时都完全相同。不幸的是我 项目太大/太复杂,不能在这里呈现。
  • 起初我假设VS2012开发服务器与IIS之间的差异导致我的问题。 但是,当我在IIS中将我的应用程序池配置为32位时, 一切正常。移至64位会导致此行为。
  • 内存使用似乎不是问题;在我的应用程序中我使用(大)xml输入文件。对这些文件(大小)的更改没有 影响我的问题。
  • 我尝试使用为webservices提供的诊断工具。这些并没有真正帮助我,因为我可以看到会发生什么(或者我应该说 在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()'时,我的代码运行正常(但当然,我不希望这样)。

任何人都有任何线索?提前谢谢!

4 个答案:

答案 0 :(得分:1)

你是从背景工作者那里运行的吗? 我认为你可能遇到了第一段代码中的线程锁定问题,但是返回null允许线程在你的第二部分代码中完成。

我在这些相同的行中看到了一些错误,其中使用MessageBox.Show()命令将允许代码正常工作。

答案 1 :(得分:0)

此问题可能与平台本身有关。您可以向Microsoft Connect报告,希望您能快速得到答案。

答案 2 :(得分:0)

项目中的任何参考程序集是否偶然32位并在该方法的范围内引用?如果是这样,那么为什么在64中运行会导致未定义的行为将是一个很好的例子。我之前在另一个项目上遇到过这种情况,并且发生了神秘的应用程序崩溃。

答案 3 :(得分:0)

当使用64位机器时,我已经在VS2012中看到类似的行为,通过将平台明确地设置为x64(而不是“任何CPU”)并且还通过禁用(取消选中)来纠正(即,坏行为消失) )任何'启用调试器'。我没有解释为什么这些黑客行之有效。

您可以在菜单:Build-> Configuration Manager ....

中创建一个新的“Active solution platform”

可在菜单中找到调试设置:Project-> proj属性。

我有兴趣了解为什么这有效或者其他人已经找到类似的解决方案来解决异常中无法解释的行为问题。