2015-11-15 48 views
1

我需要创建一个函数,在某些情况下生成一个异常,但我需要它使用try catch产生一个特定的错误。 它使用的功能:Ocaml例外与尝试捕获

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) 

;; 

我需要确保的是,在瓦尔X的情况下,当查找结果是无我需要打印一个异常

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

eval评估当前环境的表达式 ex。

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 查找给出的提示应该抛出以下异常:

加薪(MLFailure “未找到”)

而EVAL应该抛出下列之一:

的eval(EVN,无功“P “);;

例外:MLFailure“variable not bound:p”。

看来你必须在这里做异常处理。您可以使用

试用 | - >

要捕捉的语法&处理eval内的异常。

+0

这是什么问题?您是否尝试过Google或OCaml手册? – antron

回答

2

目前还不清楚你在问什么。但我怀疑你的助教已经告诉你你需要知道什么。您可以阅读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") 
+0

你能给我一个匹配函数的例子和其中一个匹配的例外,因为我仍然认为我的格式错了。 –

+0

我试过这个,并没有工作let lookup(x,evn)=尝试匹配listAssoc(x,evn)与 | Some Int v - > Int v |无 - >提高(MLFailure“找不到”) ;; –

+0

此代码有语法错误。你有一个'match'和一个'try',但只有一个'with'。每个'match'和每个'try'都必须有'with'。它还需要括号:'Some(Int v)'。但是,我没有看到异常处理的问题。 –