Почему этот метод возвращает double.PositiveInfinity, а не DivideByZeroException?

Я запустил следующий фрагмент в интерактивном C2015 C # и получил очень странное поведение.

> double divide(double a, double b)
. {
.     try
.     {
.         return a / b;
.     }
.     catch (DivideByZeroException exception)
.     {
.         throw new ArgumentException("Argument b must be non zero.", exception);
.     }
. }    
> divide(3,0)
Infinity    
> 3 / 0
(1,1): error CS0020: Division by constant zero
> var b = 0;
> 3 / b
Attempted to divide by zero.
> 

Почему метод возвращает бесконечность, в то время как 3/0 выдает ошибку, а 3 / b выдает сформированную ошибку? Могу ли я заставить подразделение выдать ошибку вместо возврата бесконечности?

Если я переформатирую метод в

double divide(double a, double b)
{
    if ( b == 0 )
    {
        throw new ArgumentException("Argument b must be non zero.", new DivideByZeroException());
    }
    return a / b;
}

будет ли новое DivideByZeroException содержать всю ту же информацию и структуру, что и уловленное исключение?

Ответы на вопрос(4)

Ваш ответ на вопрос