F#无法捕获DivideByZeroException异常。

5

我试图在除以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
1个回答

8

F# 中的 float 是一个 64 位 IEEE 754 双精度数。它们对于 ±零、±无穷大和 NaN 具有明确定义的值。

对于所有除以零的浮点数(除了 decimal),不会抛出 DivideByZeroException 异常,而是使用该类型的特殊表示。

> let ``+∞``, ``-∞`` = 1.0 / 0.0, -1.0 / 0.0;;
val ( -∞ ) : float = -infinity
val ( +∞ ) : float = infinity

在你的例子中,除以零会给你一个Double.PositiveInfinity。 整数值(intlonguint等)都像你预期的那样抛出除以零异常。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接