Если вы хотите получить арифметическое исключение, попробуйте делить целое на ноль. Тип System.Double
(float
в F #) по дизайну не вызывает исключений (все исключительные обстоятельства заканчиваются на NaN
).
От the MSDN docs:
Операторы с плавающей точкой, включая операторы присваивания, делать не бросать исключения. Вместо этого, в исключительных ситуациях результат операции в с плавающей точкой равна нулю, бесконечность, или NaN ....
Update: Если вы хотите исключения быть выброшен в случаях Infinity
или NaN
, я бы предложил same advice as desco и предложил вам обернуть методы, которые вы хотите вызвать.
К сожалению, я недостаточно знаком с F #, чтобы приводить примеры кода на выбранном вами языке; но в C# вы можете сделать это, например, для функции квадратного корня:
public static double CheckedSqrt(double x)
{
double sqrt = Math.Sqrt(x);
if (double.IsNaN(sqrt))
{
throw new ArithmeticException("The square root of " + x + " is NaN.");
}
return sqrt;
}
Update 2: Еще один вариант должен были бы написать свою собственную обертку для самого double
типа, который не позволяет Infinity
или NaN
значения (опять же, ниже C# -I прошу прощения, если это не представляется возможным в F # в этом случае я даю вам абсолютно бесполезные советы):
public struct CheckedDouble // : IEquatable<CheckedDouble>, etc.
{
double m_value;
public CheckedDouble(double value)
{
if (double.IsInfinity(value) || double.IsNaN(value))
{
throw new ArithmeticException("A calculation resulted in infinity or NaN.");
}
m_value = value;
}
public static implicit operator CheckedDouble(double value)
{
return new CheckedDouble(value);
}
public static implicit operator double(CheckedDouble checkedDouble)
{
return checkedDouble.m_value;
}
}
Тогда везде, где вы пишете код WHER e вы не хотите разрешать Infinity
или NaN
, используйте этот тип, а не double
напрямую.
Просто еще один вариант.
+1 Вычисления выражения еще раз сохраняют день. – Daniel
Мне не нравится ваше решение, но я буду отмечать его как принятый ответ, потому что это, вероятно, единственный способ пойти, кроме обертывания поплавка. Но определенно есть возможность выбросить исключение на NaN, бесконечность для удвоений для целей отладки ... –
Мне нравится 'Double.IsNaN (v) |> not' idiom. Не! – Gabe