2013-05-13 74 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