2012-10-18 31 views

回答

3

首先它是handle Error => ...(或handle error => ...handle TheSpecificExceptionIWantToCatch => ...),而不是handle Error msg => ...。如果Foo是帶有一個參數的構造函數,則只能編寫handle Foo msg => ...,如錯誤消息所示,Error不是。其次「無約束變量」是一個編譯錯誤,不是一個例外,所以它不能被捕獲。

+0

明白了,謝謝! –

1

只是添加到現有的答案。我注意到Chao試圖根據收到的嘗試執行代碼的消息「發現」Error。 REPL中的真正異常消息報告在val it =() : unit之後,表明它發生在解釋階段之後。此外,在新澤西州v110.76解釋的標準ML,它出現在執行時有這樣的消息:

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. 的例外fl的中斷可以使用在異常構造函數上使用模式匹配的句柄表達式來捕獲ow,並提交和用於評估的替代表達式。在這種情況下表達e1引發異常,處理程序返回表達E2:e1 handle MyException => e2

有關,如果需要的話如何編寫複雜的功能,乾淨優雅的異常處理程序,以執行恢復的詳細信息,請閱讀此頁在線紙幣Programming in Standard ML by Robert Harper