2015-11-15 78 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)'。但是,我沒有看到異常處理的問題。 –