Если вы хотите получить арифметическое исключение, попробуйте разделить целое число на ноль.Тип System.Double
(float
в F #) по конструкции не создает исключений (все исключительные обстоятельства заканчиваются на NaN
).
С документы MSDN :
Операторы с плавающей запятой, включая операторы присваивания, не генерируют исключения.Вместо этого в исключительных ситуациях результатом операции с плавающей запятой является ноль, бесконечность или NaN ....
Обновление : если вы хотите, чтобы исключения былиброшенный в случаях Infinity
или NaN
, я бы предложил такой же совет, как и desco , и предложил бы вам обернуть методы, которые вы хотите вызвать.
К сожалению, я не знакомдостаточно с F #, чтобы привести примеры кода на вашем языке;но в C # вы можете сделать это, например, для функции sqrt:
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;
}
Обновление 2 : еще один вариант - написать собственную оболочку для double
введите сам, который не позволяет значения Infinity
или NaN
(опять же, ниже C # - я прошу прощения, если это невозможно в 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;
}
}
Тогда везде, где вы пишете код, для которого вы не хотите разрешать Infinity
или NaN
, используйте этот тип вместо double
напрямую.
Просто еще один вариант.