Я провел следующий фрагмент в VS2015 C# в интерактивном режиме и получил очень странное поведение.Почему этот метод возвращает double.PositiveInfinity не DivideByZeroException?
> 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 содержит ту же информацию и структуру, что поймано исключение будет?
Этот вопрос не о java – pquest
My bad! Хотя это относится и к C#. – codemonger
@codemonger Математически говоря, N/0 не равно бесконечности. Более разумно исключать исключение, чем для любого возвращаемого значения, даже учитывая, что числа с плавающей запятой поддерживают значение +/- Infinity. NaN будет более уместным, чем бесконечность. –