OCaml:使用行号信息定义复合异常类型

OCaml:使用行号信息定义复合异常类型,ocaml,Ocaml,我正在处理一些OCaml代码,我想定义一个复合异常类型;详情如下: type exceptbase = string * string exception UndefinedTyp of exceptbase 我希望这种例外的第一个要素是。 但是,当我使用下面的一些异常处理代码时,它无法编译 raise UndefinedTyp (__LOC__, "some exception messages") 下面是我的问题: 如何正确定义这样的复合异常类型 请注意,由于第一个元素始终是,\uuuu

我正在处理一些
OCaml
代码,我想定义一个复合异常类型;详情如下:

type exceptbase = string * string
exception UndefinedTyp of exceptbase
我希望这种例外的第一个要素是。 但是,当我使用下面的一些异常处理代码时,它无法编译

raise UndefinedTyp (__LOC__, "some exception messages")
下面是我的问题:

  • 如何正确定义这样的复合异常类型
  • 请注意,由于第一个元素始终是
    \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
    ,我有没有办法省力,并使用
    \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

  • 您只需要一些括号:

    # 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").
    

    关于第二点,在普通的OCaml中,恐怕不可能省略
    \uuuuuuuuuuuuuuu
    参数

    但是,您可以编写一个处理器,将
    未定义的“某些异常消息”
    重写为
    未定义的(\uu LOC\uuuu,“某些异常消息”)
    。今天,我们使用PPX框架来编写这样的预处理器


    顺便说一句,OCaml的异常回溯包含引发异常的位置。通过设置环境变量OCAMLRUNPARAM=b
    ,当未捕获的异常终止程序时,OCaml运行时会将其与源代码位置一起打印。通过编程
    Printexc
    模块提供了一些API来获取它。

    谢谢Jeffrey。那么,我是否有可能使用
    \uuuu LOC\uuu
    来“预占用”第一个元素?非常感谢。最后,我选择使用
    Core
    中的异常功能,因为它已经提供了这样的功能。。。请看一下这一部分。回溯不是一个核心特性。您可以通过添加
    OCAMLRUNPARAM=b
    或设置
    Printexc.record\u backtraces
    将它们与普通OCaml一起使用。谢谢!我最终使用了
    Core
    提供的异常处理。。请看一下这个部分。