【发布时间】:2012-10-18 14:11:14
【问题描述】:
我有一个新手问题:在标准 ML 中,您如何捕获“错误:未绑定变量或构造函数:foo”之类的异常?
我尝试使用以下程序来做到这一点:
(foo())
handle Error msg => ();
但是 REPL 抱怨:“错误:非构造函数应用于模式中的参数:错误”
提前致谢。
【问题讨论】:
我有一个新手问题:在标准 ML 中,您如何捕获“错误:未绑定变量或构造函数:foo”之类的异常?
我尝试使用以下程序来做到这一点:
(foo())
handle Error msg => ();
但是 REPL 抱怨:“错误:非构造函数应用于模式中的参数:错误”
提前致谢。
【问题讨论】:
首先是handle Error => ...(或handle error => ... 或handle TheSpecificExceptionIWantToCatch => ...),而不是handle Error msg => ...。如果Foo 是具有一个参数的构造函数,则只能编写handle Foo msg => ...,正如错误消息所示,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
有关如何为复杂函数编写简洁优雅的异常处理程序以及恢复执行(如果需要)的更多详细信息,请阅读此页面的在线注释Programming in Standard ML by Robert Harper
【讨论】: