2013-05-13 25 views
3

當我使用抓,我得到這樣的警告:如何正確使用漁獲物?

Warning: In the use of `catch' 
     (imported from System.IO.Error): 
     Deprecated: "Please use the new exceptions variant, Control.Exception.catch" 

我試着使用Control.Exception.catch代替,但我一直在追逐的錯誤下來太多的鼠洞。有人可以發佈一個示例,其中catch的第2個參數捕獲getTemporaryDirectory拋出的UnsupportedOperation錯誤嗎?

tempdir <- catch (getTemporaryDirectory) 
       (\e -> return ".") 

而且,我怎麼使用在catch文檔捕捉語法:

catch f (\e -> ... (e :: SomeException) ...) 

我已經試過了語法,我能想到的每一個變化,我總是得到一個錯誤;似乎不可能將類型註釋(?)括在類似於lambda中的括號中。我認爲文檔非常差。不幸的是,這似乎是文檔編寫者渴望的標準。

回答

3

一個簡單的伎倆,沒有任何擴展的工作原理是:

m `catch` (\e -> do 
    let _ = e :: IOException -- or whatever exception type you want to catch 
    doStuff) 

如果您使用的值e,那麼你也可以只把類型標註無論你使用它:

m `catch` (\e -> do 
    print (e :: IOException) 
    doStuff) 
+1

」不是個是否認爲所有例外都是不好的做法?我試圖限制捕獲只捕獲UnsupportedOperation。當我使用e :: UnsupportedOperation時,我得到了類型構造函數或類UnsupportedOperation。我還會注意到,我看起來很高,在haskell文檔中查看haskell例外列表無濟於事。 – 7stud 2013-05-13 18:16:10

+1

哦!您可以捕獲IOException,然後使用System.IO.Error中的函數來確定它是哪種類型的IOException。但是,最新的'base'沒有'UnsupportedOperation'' IOException'。它有一個非法的操作錯誤,你可以用'isIllegalOperation'來測試,但是我需要檢查這個函數是否是正確的例外。等一下。 – 2013-05-13 18:24:06

+0

@ 7stud對不起,我找不出它會拋出哪個異常。 :(你現在最好的選擇就是捕捉'IOException'。 – 2013-05-13 18:44:14