F# 无法捕获 DivideByZeroException

Dar*_*ive 4 f#

我试图在执行除以 0 时捕获异常,但是,无论实现如何,代码都没有显示任何实质内容,总是声称结果是“无穷大”(意思是,从我得到的来看,它只是执行了除法而忽略了其他一切)

这是什么原因,如何补救?

open System

type instruction = 
  | ADD
  | SUB
  | MUL
  | SQR
  | DIV
  | PUSH of float
type stack = float list

exception BLEDNY_PROGRAM of (instruction * stack)
exception DivideByZeroException

let intInstr (x, y) = 
        match x, y with
        | ADD, a::b::ys -> (b + a) :: ys : stack
        | SUB, a::b::ys -> (b-a)::ys
        | MUL, a::b::ys -> (b*a)::ys
        | SQR, a::ys -> (a * a)::ys
        | DIV, a::b::ys -> try (b/a)::ys with | :? System.DivideByZeroException -> (printf "B??d: dzielenie przez zero"; ys)
        | PUSH x, ys -> x::ys
        | _ , _ -> raise (BLEDNY_PROGRAM(x, y));

let intpProg(is) =
   let rec iPS = function
           | ([],x::xs) -> x
           | (i::is, xs) -> iPS(is, intInstr(i, xs))
   iPS(is,[])

let il3 = [PUSH 3.0; PUSH 0.0; DIV];
let e = intpProg(il3)
printfn "%A" e
Run Code Online (Sandbox Code Playgroud)

Ast*_*sti 8

floatF# 中的A是 64 位 IEEE 754双精度数。它们具有明确定义的 ±0、±infinity 和 NaN 值。

对于零(所有浮点部门除了十进制),一个DivideByZeroException没有被抛出,而是使用类型的特别代表。

> let ``+?``, ``-?`` = 1.0 / 0.0, -1.0 / 0.0;;
val ( -? ) : float = -infinity
val ( +? ) : float = infinity
Run Code Online (Sandbox Code Playgroud)

在您的示例中,除以零将为您提供Double.PositiveInfinity. 如您所料,整数值(intlonguint等)都会被零除。