如何在使用HTTP管道时干净利落地处理所有可能的错误?

时间:2013-08-10 17:20:33

标签: haskell conduit

我有一些看起来像这样的代码:

retryOnTimeout :: IO a -> IO a
retryOnTimeout action = catch action $ \ResponseTimeout -> 
                            do putStrLn "Timed out. Trying again."
                               threadDelay 5000000
                               action 

问题是HttpException还有很多其他的构造函数,我想一般再试一次,不管错误到底是什么。现在,如果我用ResponseTimeout替换_,那么我将收到编译错误,因为它无法推断出异常的类型。

我真的不想为异常处理程序提供类型签名。

我知道它不是很多重复,但为_添加一个案例感觉不对,因为它就像是说:如果异常是ResponseTimeout然后做x,但如果异常是其他的做同样的事情。是否有一种使用通配符的简洁方法,但仍然让编译器知道它是哪种类型?

1 个答案:

答案 0 :(得分:6)

如果你不关心异常值,那么使用_就完全没了问题,但你需要使用ScopedTypeVariables或let子句来指定你想要的类型。

{-# LANGUAGE ScopedTypeVariables #-}

retryOnTimeout :: IO a -> IO a
retryOnTimeout action = catch action $ \ (_ :: HttpException) -> do
  putStrLn "Timed out. Trying again."
  threadDelay 5000000
  action