2

お客様のマシンでは、次の行でArithmeticException (算術演算のオーバーフローまたはアンダーフロー)が発生します。どの PC (お客様または当社のもの) でも再現できません。

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

hdd.Capacityhdd.FreeSpaceはどこですかuint。値は、ネイティブ DLL の関数からのものです。

プログラムでNOcheckedまたはuncheckedキーワードを使用します。/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 に答える