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



我的c# webservice应用程序遇到了一个问题。在某一点上不再处理异常。应用程序只是停止,没有任何进一步的消息/错误异常。结果如下:

问题:

  • 在方法的catch部分抛出一个新的异常,其中包含关于异常的附加信息;
  • 底层异常来自我的应用程序的另一部分;异常的"堆栈"大约是20,但这似乎不是这里有问题;
  • 当使用VS2012开发服务器(我假设是32位)或IIS在32位模式时,抛出的异常由调用方法按预期拾取(最终导致我的webservice的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()'时,我的代码也运行得很好(当然,我不希望那样)。

有人知道吗?提前感谢!

你是在后台运行这个程序吗?我认为你可能会遇到一个问题,线程锁定在你的代码的第一部分,但然后返回null允许线程在你的代码的第二部分完成。

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

此问题可能与平台本身有关。你可以把它报告给Microsoft Connect,希望你能很快得到答案。

您的项目中的任何参考程序集都是32位的,并且在该方法的范围内引用吗?如果是这样,那将是一个很好的例子,为什么在64运行会导致未定义的行为。我之前在另一个项目中也遇到过这个问题,并且出现了一些神秘的应用崩溃。

当使用64位机器时,我在VS2012中看到了类似的行为,通过将平台显式设置为x64(而不是'Any CPU')并通过禁用(取消勾选)任何'启用的调试器'来纠正(即,不良行为消失)。我无法解释为什么这些黑客会成功。

您可以在菜单:构建->配置管理器....中创建新的"活动解决方案平台"

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

我有兴趣找出为什么这是有效的,或者如果其他人已经发现类似的修复无法解释的行为问题周围的异常。

最新更新