系统溢出异常 - int32太大或太小

3

我需要一些建议。

我有一个在晚上运行的Windows服务。在我的开发环境中,它可以无异常地运行,但是当我在“其他机器上安装并运行”时,第二天早上我会遇到一个System.Overflow异常,提示我将int32设置为太大或太小的值。

我已经仔细检查了服务的c#代码,并且在所有可能出错的代码周围都加入了try/catch语句,应该能捕获任何错误并将其写入日志,而不会因为这个溢出异常完全停止我的服务。但是,它仍然会出现并停止服务。

我希望能得到一些概念性的建议,以确定引起这种错误的原因。


2
异常的堆栈跟踪是什么? - SLaks
1
将远程调试器附加到它上面。 - pm100
1
或者如果溢出不重要,可以将错误发生的赋值更改为:myint = unchecked(assignment); 这将让溢出滚动。但您可能需要先找到错误。 - Mikael Svenson
1
如果您在计算机上放置了调试版本,您可以生成一个堆栈跟踪而无需使用VS,请查看http://msdn.microsoft.com/en-us/library/system.diagnostics.stacktrace.aspx。 - rerun
2
或者是一个发布版本,但包括 PDB 文件以在堆栈跟踪中包含行号。 - Mikael Svenson
显示剩余2条评论
4个回答

2

在代码中添加 try/catch 块的问题是很容易错过某些地方,从而无法记录异常。更为健壮的方法是使用值 AppDomain.UnhandledException。这将触发任何未在当前 AppDomain 中处理的异常。您可以连接到此以将信息写入日志文件,并希望更好地了解错误产生的位置。

AppDomain.CurrentDomain.UnhandledException += OnUnhandledException;

...

void OnUnhandledException(object sender, UnhandledExceptionEventArgs e) {
 // Log the exception here
}

1
  • 你可能错过了try/catch的一个实例,或者你的错误处理程序出现了错误,导致它无法被处理。
  • 在Windows中,你可以设置你的服务在意外结束时重新启动。

1
首先,让我告诉你溢出/下溢可以通过打开项目属性,选择“生成”(从左侧菜单中),然后选择“高级...”来禁用。
顺便说一句,我经常这样做,因为它会增加开销,而我不希望在我的科学应用程序中出现这种情况。然后,我手动控制事物。
但这并不能解决问题...如果这是一个问题,它只是隐藏了“问题”。
如果您只关心代码中的零/非零条件检查,那么在项目设置中禁用溢出就可以解决问题,因为即使发生溢出,您也会得到一个非零值,并且您的服务将继续运行而没有问题。

1
你是默认禁用它的,还是只在发布版本中禁用它?我希望是后者,这样可以消除代码中任何潜在的错误,或者你有单元测试来覆盖这个问题 :) 在我看来,最好在你知道使用unchecked关键字是可以的地方禁用它。 - Mikael Svenson
1
@Mikael Svenson:你是正确的,在发布版本中,我禁用算术溢出/下溢,因为这会带来额外的开销。 - ileon
以前不知道这个功能,但它好像默认是禁用的。打开它似乎在我的光线跟踪器中没有明显的性能差异,也许JIT认为它不是必要的。 - JulianR
1
@JulianR:对于 GUI 代码或不执行密集计算(如数学计算)的代码,您不会注意到任何差异。但是,尝试在解决200000个同时方程组的代码上使用此选项,您将看到区别! - ileon
我会把实时光线追踪器归类为“计算密集型”类别。但这仍然没有任何区别。并不是说这些检查不会对性能产生影响,只是说这些检查似乎根本不存在。 - JulianR

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接