exception - 如何在 SML/NJ 中报告未处理的异常?

标签 exception handle smlnj raise

我在名为 testexc.sml 的文件中有以下 SML 程序:

structure TestExc : sig
               val main : (string * string list -> int)
               end =
  struct

  exception OhNoes;

     fun main(prog_name, args) = (
       raise OhNoes
     )

end

我用 smlnj-110.74 像这样构建它:

ml-build sources.cm TestExc.main testimg

其中 sources.cm 包含:

Group is
  csx.sml

我这样调用程序(在 Mac OS 10.8 上):

sml @SMLload testimg.x86-darwin

我希望在调用程序时看到东西,但我得到的唯一结果是返回代码 1:

$ sml @SMLload testimg.x86-darwin
$ echo $?
1

什么给了?为什么 SML 会在这个未处理的异常上默默地失败?这种行为正常吗?有没有我可以放在 main 上的一些通用处理程序来打印发生的错误?我意识到我可以匹配异常 OhNoes,但是对于包含我可能不知道的异常的大型程序呢?

最佳答案

答案是处理异常,将其称为 e,并使用系统中可用的几个函数打印数据:

$ sml
Standard ML of New Jersey v110.74 [built: Tue Jan 31 16:23:10 2012]
- exnName;
val it = fn : exn -> string
- exnMessage;
val it = fn : exn -> string
-

现在,我们有了修改后的程序,如果我们将通用处理程序附加到 main() 上:

structure TestExc : sig
               val main : (string * string list -> int)
               end =
  struct

  exception OhNoes;
  open List;

     fun exnToString(e) =
        List.foldr (op ^) "" ["[",
                              exnName e,
                              " ",
                              exnMessage e,
                              "]"]

     fun main(prog_name, args) = (
       raise OhNoes
     )
     handle e => (
       print("Grasshopper disassemble: " ^ exnToString(e));
       42)

end

我使用列表来生成消息,因此要构建此程序,您需要引用 sources.cm 中的基础库:

Group is
  $/basis.cm
  sources.cm

下面是我们运行它时的样子:

$ sml @SMLload testimg.x86-darwin
Grasshopper disassemble: [OhNoes OhNoes (more info unavailable: ExnInfoHook not initialized)]
$ echo $?
42

我不知道 ExnInfoHook 是什么,但至少我看到了 OhNoes。可惜 SML 编译器没有为我们添加一个基本的处理程序,以便在编译的程序中出现未处理的异常时打印一些东西。我怀疑 ml-build 会负责这项任务。

关于exception - 如何在 SML/NJ 中报告未处理的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20533723/

相关文章:

r - R 中的异常处理和堆栈展开

javascript - 使用 axios 将数据发送到输入 ReactJS 中的每个更改

smlnj - 无法确定操作系统

java - 演示自定义异常继承java

c++ - 使用 -fno-rtti 在 OS X 上引发和捕获异常的问题

exception - FFMPeg 异常 setDataSource 失败 : status = 0xFFFFFFFF

c++ - 在 C++ 中处理对象

c - HANDLE - 文件句柄和目录句柄结构

functional-programming - 有哪些高质量的标准 ML 代码/项目可供学习?