也许我真正的问题是“这是否适合学习Perl 6”?基于Should this Perl 6 CATCH block be able to change variables in the lexical scope?,似乎最简单的例子可能超出了一个简单的例子。我什么时候需要恢复Perl 6异常?
在那个问题中,我正在处理一些对于特定问题而言似乎愚蠢或者更好的东西,因为我正在玩特性而不是解决问题。
有警告的记录使用作为特殊类型的异常(“控制异常”),你得到的消息,可以捕捉它,如果你喜欢,但也可以忽略它,它会自行恢复(虽然我是这在Where should I catch a Perl 6 warning control exception?中相当愚蠢)。
除此之外,我正在考虑调用者可以处理被调用者范围之外的失败的事情。例如,重新连接到数据库,修复丢失的目录以及被调用者没有责任的其他外部资源问题。
在阅读其他语言的这类内容时,建议主要是不使用它们,因为在“真实世界”编程中,人们往往不会真正处理问题。
C# exception handler resume next的答案似乎是说这是不好的做法和丑陋的代码。我当然还没有想到在被调用者中隐藏一堆代码的方法。
我砍掉了这个例子,虽然我不相信这是一个很好的方法来做它或推荐给初学者。该程序在启动时查找PID文件。如果它找到一个,它会抛出一个异常。处理该异常将检查其他实例是否仍在运行,这可能会引发不同类型的异常。而且,还有一个可以处理文件IO问题。诀窍是X::MyProgram::FoundSemaphore
可以恢复,如果其他程序没有运行(但留下PID文件)。
对于这个问题不重要,但请注意'BEGIN'在编译时运行。模块在安装时编译,因此放置在模块中的代码可能不会完成预期的工作。 'INIT'对于程序启动似乎是一个更好的选择,并且在模块情况下可以正常工作。 –
是的,INIT似乎更好。 –