2

我们在客户机器上的以下行中得到一个ArithmeticException(算术运算中的溢出或下溢。) 。我们无法在任何 PC(客户或我们的)上复制它:

var actualFullness = (byte)((hdd.Capacity - hdd.FreeSpace) / (float)hdd.Capacity * 100);

在哪里hdd.Capacityhdd.FreeSpace在哪里uint。值来自本机 DLL 中的函数。

我们在程序中使用 NOcheckedunchecked关键字。我们不使用/checked编译器选项。

它是用 .NET 4 编写的,并且作为 32 位进程运行。

知道为什么会抛出这个异常吗?

4

2 回答 2

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));
    }
}

事实上,通过静态分析很容易看出问题中的表达式不对错误负责。

因此,您似乎确实误诊了故障。也许您引用的本机代码以某种方式触发了异常。无论如何,唯一要说的是,您需要深入挖掘并尝试对问题进行正确诊断。

于 2014-04-23T09:55:04.130 回答
0

ArithmeticException是 、 和 的DivideByZeroExceptionNotFiniteNumberExceptionOverflowException。通常,将抛出 ArithmeticException 的派生类之一以更准确地指示错误的确切性质。

由于您没有得到任何更具体的内容,因此您的表达背后有问题。ACapacityFreeSpacegetter 是要研究的候选者。

我已经针对不同的场景检查了以下代码,如果有效

uint Capacity = 100; //110; uint.MaxValue;  0
uint FreeSpace = 110;//100; 0;              uint.MaxValue
var actualFullness = (byte)((Capacity - FreeSpace) / (float)Capacity * 100);
于 2014-04-23T09:42:02.953 回答