如果您想要算术异常,请尝试将整数除以零。设计的System.Double
类型(float
在 F# 中)不会引发异常(所有异常情况都以 结束NaN
)。
从MSDN 文档:
浮点运算符(包括赋值运算符)不会引发异常。相反,在特殊情况下,浮点运算的结果是零、无穷大或 NaN....
更新Infinity
:如果您希望在or的情况下引发异常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
直接使用。
只是另一种选择。