3

当我使用 catch 时,我收到以下警告:

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 的第二个参数捕获 getTemporaryDirectory 引发的 UnsupportedOperation 错误?

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

另外,如何在 catch 文档中使用 catch 语法:

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

我已经尝试了我能想到的所有语法变体,但总是出错;似乎不可能像在 lambda 中那样将类型注释(?)括在括号中。在我看来,文档极差。不幸的是,这似乎是文档作者所追求的标准。

4

1 回答 1

3

一个无需任何扩展即可工作的简单技巧是:

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

如果您使用 value e,那么您也可以将类型注释放在您使用它的任何地方:

m `catch` (\e -> do
    print (e :: IOException)
    doStuff )
于 2013-05-13T18:13:26.583 回答