我有一个新手问题:在标准 ML 中,您如何捕获“错误:未绑定的变量或构造函数:foo”之类的异常?
我尝试使用以下程序来做到这一点:
(foo())
handle Error msg => ();
但 REPL 抱怨:“错误:非构造函数应用于模式中的参数:错误”
提前致谢。
首先它是handle Error => ...
(或handle error => ...
或handle TheSpecificExceptionIWantToCatch => ...
),而不是handle Error msg => ...
。您只能编写handle Foo msg => ...
ifFoo
是带有一个参数的构造函数,正如错误消息所暗示的那样,Error
它不是。
其次“未绑定变量”是编译错误,不是异常,所以无法捕获。
只是添加到现有的答案。我注意到 Chao 试图根据它收到的尝试执行代码的消息来“捕捉”一个错误。REPL 中的真正异常消息在该行之后立即报告val it = () : unit
,表明它发生在解释阶段之后。此外,在新泽西 v110.76 解释器的标准 ML 中,它在执行时出现如下消息:
uncaught exception ExceptionName
raised at: filename.sml:linei.columni-linej.columnj
因此,如果没有看到这些明确的消息,应该会发出警报,即没有引发异常,没有双关语的意思。由于问题是如何捕获异常而不是错误,因此我认为必须简要解释异常的机制:
exception MyException
或exception MyException2 of String
raise MyException
或raise (MyException2("Error in foo"))
e1
引发异常并且处理程序返回表达式 e2:e1 handle MyException => e2
有关如何为复杂函数编写干净优雅的异常处理程序以及恢复执行(如果需要)的更多详细信息,请阅读Robert Harper 的在线注释 Programming in Standard ML 的这一页