我需要创建一个在某些情况下生成异常的函数,但是我需要它来使用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应抛出以下内容:
异常:MLFailure“变量未绑定:p”。
你好像要在这里做异常处理。
可以使用尝试 | - >
抓住&的语法处理eval中的异常。
答案 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")