8

NUnit を介して次の C# コードを実行すると、

Test.ControllerTest.TestSanity: Expected: `<System.DivideByZeroException>` But was:  null

したがって、DivideByZeroException がスローされないか、NUnit がキャッチしません。この質問に似ていますが、彼が得た答えは私にはうまくいかないようです. これは、NUnit 2.5.5.10112 と .NET 4.0.30319 を使用しています。

    [Test]
    public void TestSanity()
    {
        Assert.Throws<DivideByZeroException>(new TestDelegate(() => DivideByZero()));
    }

    private void DivideByZero()
    {
        // Parse "0" to make sure to get an error at run time, not compile time.
        var a = (1 / Double.Parse("0"));
    }

何か案は?

4

2 に答える 2

21

例外はスローされません。1 / 0.0 は double.PositiveInfinity を提供します。これはIEEE 754標準で指定されており、C# (および基本的に他のすべてのシステム) が準拠しています。

浮動小数点除算コードで例外が必要な場合は、ゼロを明示的にチェックし、自分でスローします。DivideByZeroException が何を取得するかを確認したいだけの場合は、手動でスローするか、整数を整数ゼロで除算します。

于 2010-05-31T19:46:14.520 に答える
7

MSDNから:

整数値または 10 進数値をゼロで除算しようとするとスローされる例外。

整数型 (など) またはを扱ってdouble,いません。コンテキスト内であっても、ここでは例外をスローしません。+INF を取得するだけです。intdecimaldoublechecked

整数演算として評価したい (そして例外を取得したい) 場合は、次を使用します。

var a = (1 / int.Parse("0"));
于 2010-05-31T19:48:45.140 に答える