我们在客户机器上的以下行中得到 ArithmeticException(算术运算中的溢出或下溢。)。我们无法在任何PC(客户或我们的)上复制它:
var actualFullness = (byte)((hdd.Capacity - hdd.FreeSpace) / (float)hdd.Capacity * 100);
其中hdd.Capacity
和hdd.FreeSpace
为uint
。值来自本机DLL中的函数。
我们在计划中使用了NO checked
或unchecked
个关键字。我们不使用 / checked 编译器选项。
它是用.NET 4编写的,并以32位进程运行。
知道抛出此异常的原因吗?
答案 0 :(得分:0)
ArithmeticException
是DivideByZeroException
,NotFiniteNumberException
和OverflowException
的基类。通常,将抛出ArithmeticException的派生类之一,以更精确地指示错误的确切性质。
既然你没有得到任何更具体的那些,那么你的表达背后就会出现问题。 Capacity
或FreeSpace
吸气剂是值得研究的候选者。
我已经针对不同的场景检查了以下代码,如果有的话
uint Capacity = 100; //110; uint.MaxValue; 0
uint FreeSpace = 110;//100; 0; uint.MaxValue
var actualFullness = (byte)((Capacity - FreeSpace) / (float)Capacity * 100);
答案 1 :(得分:0)
问题中显示的算术不会引发异常。这个程序涵盖了边缘情况并且运行得很好:
class Program
{
static byte test(uint capacity, uint free)
{
return (byte)((capacity - free) / (float)capacity * 100);
}
static void Main(string[] args)
{
Console.WriteLine(test(uint.MaxValue, uint.MaxValue));
Console.WriteLine(test(0, 0));
Console.WriteLine(test(uint.MaxValue, 0));
Console.WriteLine(test(0, uint.MaxValue));
}
}
事实上,通过静态分析很容易看出问题中的表达式不对错误负责。
所以你似乎确实错误地诊断了这个错误。也许您引用的本机代码以某种方式触发异常。无论如何,唯一要说的是你需要深入挖掘并尝试正确诊断问题。