C#中未经检查的代码中的ArithmeticException

时间:2014-04-23 09:10:17

标签: c# .net-4.0 checked unchecked arithmeticexception

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

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

其中hdd.Capacityhdd.FreeSpaceuint。值来自本机DLL中的函数。

我们在计划中使用了NO checkedunchecked个关键字。我们不使用 / checked 编译器选项。

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

知道抛出此异常的原因吗?

2 个答案:

答案 0 :(得分:0)

ArithmeticExceptionDivideByZeroExceptionNotFiniteNumberExceptionOverflowException的基类。通常,将抛出ArithmeticException的派生类之一,以更精确地指示错误的确切性质。

既然你没有得到任何更具体的那些,那么你的表达背后就会出现问题。 CapacityFreeSpace吸气剂是值得研究的候选者。

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

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

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

所以你似乎确实错误地诊断了这个错误。也许您引用的本机代码以某种方式触发异常。无论如何,唯一要说的是你需要深入挖掘并尝试正确诊断问题。