使用Try Catch进行Ocaml异常

时间:2015-11-15 02:03:33

标签: ocaml

我需要创建一个在某些情况下生成异常的函数,但是我需要它来使用try catch生成某个错误。  它使用函数:

let lookup (x,evn) =  match listAssoc(x,evn) with
|Some Int v ->Int v
| None -> raise (MLFailure "variable not found")
;;

let arithmetic (x,y,z) = match (x,y,z) with 
| (Int a, Int b, Plus)-> Int (a+b)
| (Int a, Int b,Minus) -> Int (a-b)
| (Int a, Int b, Mul)-> Int (a*b)
| (Int a, Int b, Div)-> Int (a/b)
;;

这是功能:

let errorlookup (x,evn) =  match listAssoc(x,evn) with
|Some Int v ->Int v
| None -> raise (Nano.MLFailure "variable not found %s" x)
;;
let rec eval (evn,e) = match e with
| Const a -> Int a
| Var x-> (lookup (x,evn) )
| Bin( expr1, Plus, expr2) ->   arithmetic(eval(evn,expr1),eval(evn,expr2),Plus)
|Bin( expr1, Minus,expr2) ->  arithmetic(eval(evn,expr1),eval(evn,expr2),Minus)
|Bin( expr1, Mul, expr2) ->   arithmetic(eval(evn,expr1),eval(evn,expr2),Mul)
| Bin( expr1, Div, expr2) ->  arithmetic(eval(evn,expr1),eval(evn,expr2),Div)

;;

我需要确保在Var x的情况下,当查找结果为None时我需要打印一个Exception

eval (evn, Var "p");;
Exception: MLFailure "variable not bound: p".

eval使用当前环境评估表达式 离。

let evn = [("z1",Int 0);("x",Int 1);("y",Int 2);("z",Int 3);("z1",Int 4)];;
val evn : (string * Nano.value) list =
  [("z1", Int 0); ("x", Int 1); ("y", Int 2); ("z", Int 3); ("z1", Int 4)]

我为Bin和Val以及Expr制作了类型,但那些与此无关 我需要根据查找结果引发异常,但不要引发查找中的异常。有人建议使用try catch,但我不确定这对ocaml和这有什么用。这是TA给出的提示  lookup应抛出以下异常:

加注(MLFailure“未找到”)

而eval应抛出以下内容:

eval(evn,Var“p”);;

异常:MLFailure“变量未绑定:p”。

你好像要在这里做异常处理。

可以使用

尝试 | - >

抓住&的语法处理eval中的异常。

1 个答案:

答案 0 :(得分:2)

目前还不清楚你在问什么。但是我怀疑你的TA告诉了你需要知道什么。您可以在OCaml手册的Section 6.7中了解OCaml try ... with表达式。这是OCaml等同于其他一些语言的try ... catch

如果你想抓住一个特殊的例外,但让其他人像往常一样传播,你只需要匹配你感兴趣的那个:

try
    <expression1>
with Not_found -> <expression2>

如果你有复杂的要求,你可以匹配几个不同的例外,在匹配后你可以计算值和/或重新提出例外。

try
    <expression1>
with
| Not_found -> raise (MLFailure "abc")
| Divide_by_zero -> max_int
| _ -> raise (Invalid_argument "def")