在标准ML中,如何捕获“错误:未绑定的变量或构造函数:foo”之类的异常?

时间:2012-10-18 14:11:14

标签: sml ml

我有这个新手问题:在标准ML中,你怎么能捕获像“错误:未绑定的变量或构造函数:foo”这样的异常?

我尝试使用以下程序执行此操作:

(foo())
handle Error msg => ();

但REPL抱怨:“错误:非构造函数应用于模式中的参数:错误”

提前致谢。

2 个答案:

答案 0 :(得分:3)

首先它是handle Error => ...(或handle error => ...handle TheSpecificExceptionIWantToCatch => ...),而不是handle Error msg => ...。如果handle Foo msg => ...是带有一个参数的构造函数,则只能编写Foo,如错误消息所示,Error不是。{/ p>

其次“未绑定变量”是编译错误,不是例外,因此无法捕获。

答案 1 :(得分:1)

只是添加到现有答案。我注意到Chao试图根据收到的尝试执行代码的消息“捕获”错误。在行val it = () : unit之后立即报告REPL中的真正异常消息,表明它在解释阶段之后发生。此外,在新泽西州标准ML v110.76解释器中,它在执行时出现如下消息:

uncaught exception ExceptionName raised at: filename.sml:linei.columni-linej.columnj

因此,如果没有在这些行中看到明确的消息,引发警告没有引发任何异常,没有双关语意图。 由于问题是如何捕获异常而不是错误,我认为必须简要解释异常的机制:

  1. 在代码的某处,在使用它的词法范围内,必须定义异常绑定: exception MyExceptionexception MyException2 of String
  2. 在表达式的某个地方发现了一个案例,它值得正常控制流的中断,因此使用以下原语来做到这一点: raise MyExceptionraise (MyException2("Error in foo"))
  3. 可以使用句柄表达式捕获流的异常中断,该句柄表达式使用异常构造函数上的模式匹配并提交和替代表达式以进行评估。在这种情况下,表达式e1引发异常,处理程序返回表达式e2:e1 handle MyException => e2
  4. 有关如何为复杂函数编写干净且优雅的异常处理程序的更多详细信息,如果需要,可以恢复执行,请阅读此页面的在线注释Programming in Standard ML by Robert Harper