也許我真正的問題是「這是否適合學習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似乎更好。 –