我有這個新手問題:在標準ML中,你如何捕獲一個異常,如「錯誤:未綁定變量或構造函數:foo」?在標準ML中,如何捕獲「錯誤:未綁定變量或構造函數:foo」等異常?
我試着用下面的程序做到這一點:
(foo())
handle Error msg =>();
但REPL抱怨:「錯誤:非構造圖案應用於說法:錯誤」
在此先感謝。
我有這個新手問題:在標準ML中,你如何捕獲一個異常,如「錯誤:未綁定變量或構造函數:foo」?在標準ML中,如何捕獲「錯誤:未綁定變量或構造函數:foo」等異常?
我試着用下面的程序做到這一點:
(foo())
handle Error msg =>();
但REPL抱怨:「錯誤:非構造圖案應用於說法:錯誤」
在此先感謝。
首先它是handle Error => ...
(或handle error => ...
或handle TheSpecificExceptionIWantToCatch => ...
),而不是handle Error msg => ...
。如果Foo
是帶有一個參數的構造函數,則只能編寫handle Foo msg => ...
,如錯誤消息所示,Error
不是。其次「無約束變量」是一個編譯錯誤,不是一個例外,所以它不能被捕獲。
只是添加到現有的答案。我注意到Chao試圖根據收到的嘗試執行代碼的消息「發現」Error。 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
明白了,謝謝! –