2015-04-01 99 views
0

在OCaml中有可能讓一個異常攜帶另一個異常:尼斯輸出例外的例外

exception Example of exn 

但是,當這種異常是從另一個模塊中提出,輸出看起來是這樣的:

Module.Example(_) 

對此的任何解決方案?我想要的當然是

Module.Example(Not_found) 

或類似的。

我在OUnit中遇到了這個問題,所以我無法通過良好的放置方式解決它try ... with

回答

2

建議的解決方案是不要將值作爲值附帶,除非需要稍後重新提升它們。

然而,有一種方法可以通過註冊您自己的異常打印機來打印與您有關的異常的詳細信息。這是做如下:

(* File exn.ml *) 

exception Example of exn 

let() = 
    Printexc.register_printer (function 
    | Example e -> 
     Some ("Example("^Printexc.to_string e^")") 
    | _ -> 
     None 
) 

let() = 
    try raise (Example (Example Not_found)) 
    with e -> 
    Printf.eprintf "Uh oh: %s\n%!" (Printexc.to_string e) 

編譯並運行:

$ ocamlopt -o exn exn.ml 
$ ./exn 
Uh oh: Example(Example(Not_found)) 
+0

_爲什麼不推薦?由於打印機的問題? – 2015-04-02 16:54:09

+0

它只是與你想如何使用異常有關。我不知道捕捉它們有什麼價值,也沒有包裹它們。您可以抓住它們並將它們翻譯成對您的圖書館用戶更有意義的信息,或者如果它們已經處於用戶可以接受的形式,則讓它們通過。 一個滿足異常情況的應用就是在我們的web後端:我們的代碼中的任何地方都可以將錯誤/異常轉換爲對應於標準HTTP錯誤狀態的異常。它們被服務器循環捕獲,其他異常導致500內部服務器錯誤。 – 2015-04-02 18:32:43

0

我對這些細節並不熟悉,但我懷疑這個名字會被打印出來,如果它可以被可靠地檢索的話。它在我的實驗中從頂層打印,但不是從編譯代碼打印的。

一個可能的情況是使用Printexc.to_string將該異常轉換爲字符串,並讓Example攜帶一個字符串。或者你可以讓Example帶有例外和字符串。

+0

可能是一個工作黑客現在,謝謝。 – 2015-04-01 22:16:25