Old*_*vec 1 .net f# exception nan infinity
请考虑以下代码
let a = 5. / 0.
let b = sin a
let c = sqrt(-5.)
Run Code Online (Sandbox Code Playgroud)
它产生无限和NaN.在这两种情况下,我都想抛出一个异常(用于debuging目的).
我使用Visual Studio 2010.我将Debug/Exceptions .../Common Language Runtime Exceptions/System/System.ArithmeticException设置为"Thrown",但是在运行代码时,不会抛出任何异常.
知道为什么以及如何在NaN或Infinity上抛出异常?
正如其他人所说,您必须明确检查NaN条件.如果您想使用一些高级F#功能,那么您也可以使用计算表达式.
可以定义一个构建器,在使用绑定值时自动检查Nan let!.然后你可以这样写:
check { let! a = 5. / 0. // 'a' is checked here
let! b = sin a // 'b' is checked here
let c = sqrt(-5.) // 'c' is not checked (no 'let!')
return a, b, c }
Run Code Online (Sandbox Code Playgroud)
对于简单的检查来说,这可能是太复杂的机制,但我发现它非常好.计算构建器的定义如下所示(您需要添加While,For以及其他一些支持所有语言构造):
open System
type CheckedBuilder() =
member x.Bind(v:float, f) =
if Double.IsNaN(v) |> not then f v
else raise (new ArithmeticException())
member x.Return(v) = v
let check = CheckedBuilder()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
592 次 |
| 最近记录: |