我有这个新手问题:在标准ML中,你怎么能捕获像“错误:未绑定的变量或构造函数:foo”这样的异常?
我尝试使用以下程序执行此操作:
(foo())
handle Error msg => ();
但REPL抱怨:“错误:非构造函数应用于模式中的参数:错误”
提前致谢。
答案 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
因此,如果没有在这些行中看到明确的消息,引发警告没有引发任何异常,没有双关语意图。 由于问题是如何捕获异常而不是错误,我认为必须简要解释异常的机制:
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