如何处理ML中的零除错误

时间:2011-12-06 14:46:29

标签: error-handling sml ml divide-by-zero

我是ML的新手。

我需要定义一个以条件表达式为参数的函数,问题是表达式是否像"10 div 0 = 0"一样无效。我怎么处理这个?

例如,该函数定义如下:foo exp1 = if (exp1) then ... else...exp1"10 div 0 = 0",如何处理此除法错误。

1 个答案:

答案 0 :(得分:4)

看起来你想问一下SML中的异常处理机制。

调用div时,SML基础库中的10 div 0函数会引发Div异常。这取决于您是否需要值来处理异常。在这种情况下,您可以返回true / false或选项类型:

(* only catch exception, ignore value *)
fun div_check (x, y) = (
  ignore (x div y);
  false
) handle Div => true

(* catch exception and return option value *)
fun div_check2 (x, y) = (
  SOME (x div y)
) handle Div => NONE

<强>更新

在这种情况下,编译器不会引发Div异常,这真的很奇怪。我建议你定义一个自定义div函数并自己引发/处理异常:

exception DivByZero;

(* custom div function: raise DivByZero if y is zero *)
infix my_div;
fun x my_div y =
  if y=0 then raise DivByZero else x div y

fun div_check (x, y) = (
  ignore (x my_div y);
  false
) handle DivByZero => true

fun div_check2 (x, y) = (
  SOME (x my_div y)
) handle DivByZero => NONE
相关问题