2010-05-31 3 views
8

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

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

Так что либо не DivideByZeroException не выбрасывается, или NUnit не поймать его. Как и вопрос this, но ответы, которые он получил, похоже, не работают для меня. Это использует 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")); 
    } 

Любые идеи?

+1

Попробуйте Int32.Parse ("0") вместо Double.Parse ("0") – Joe

+0

Спасибо, ребята. Это было быстро. Человек, я знал это, но иногда вы просто не соединяете точки. – Boris

ответ

21

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

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

+0

Спасибо, это было, конечно. – Boris

7

От MSDN:

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

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

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

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

Также имеется общая информация (не специфичная для .NET) в Википедии относительно деления на ноль в стандарте IEEE с плавающей запятой. http://en.wikipedia.org/wiki/Division_by_zero#In_computer_arithmetic – Josh