Нулевое деление не выбрасывает исключение в монахини - PullRequest
8 голосов
/ 31 мая 2010

Запуск следующего кода C # через NUnit приводит к

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

Есть идеи?

Ответы [ 2 ]

21 голосов
/ 31 мая 2010

Нет исключений. 1 / 0.0 просто даст вам double.PositiveInfinity. Это то, что определяет стандарт IEEE 754, которому следует C # (и в основном любая другая система).

Если вы хотите исключение в коде деления с плавающей запятой, явно проверьте ноль и бросьте его самостоятельно. Если вы просто хотите посмотреть, что получит DivideByZeroException, либо бросьте его вручную, либо разделите целые числа на целое число ноль.

7 голосов
/ 31 мая 2010

С MSDN :

Исключение, которое генерируется при попытке делить целое или десятичное значение на ноль.

Вы имеете дело с double,, а не с целыми типами (int и т. Д.) Или decimal. double здесь не выдает исключение, даже в контексте checked. Вы просто получаете + INF.

Если вы хотите оценить как интегральную математику (и получите исключение), используйте:

var a = (1 / int.Parse("0"));
...