我正在研究一些OCaml
代码,我想定义一个复合异常类型;如下:
type exceptbase = string * string
exception UndefinedTyp of exceptbase
我希望这种例外的第一个元素是line number information。 但是,当我在下面使用一些异常处理代码时,它无法编译。
raise UndefinedTyp (__LOC__, "some exception messages")
所以这是我的问题:
__LOC__
,我有什么方法可以节省工作量并使用__LOC__
预先占用第一个元素?< / LI>
醇>
答案 0 :(得分:2)
关于第二点,在vanilla OCaml中,我恐怕不可能省略__LOC__
论证。
但您可以编写一个perprocessor来将Undefined "some exception message"
重写为Undefined (__LOC__, "some exception message")
。今天我们使用PPX框架来编写这样的预处理器。
BTW,OCaml的异常回溯包含引发异常的位置。设置环境变量OCAMLRUNPARAM=b
时,OCaml运行时会在未捕获的异常终止程序时使用源代码位置打印它。编程Printexc
模块提供了一些API来获取它。
答案 1 :(得分:1)
你只需要一些括号:
# type exceptbase = string * string
exception UndefinedTyp of exceptbase;;
type exceptbase = string * string
exception UndefinedTyp of exceptbase
# raise (UndefinedTyp (__LOC__, "some exception message"));;
Exception:
UndefinedTyp
("File \"//toplevel//\", line 2, characters -13--6",
"some exception message").