如何捕获和恢复Haskell中的临时套接字错误?

时间:2020-04-05 09:21:59

标签: haskell

我正在通过HTTP API进行大量的抓取工作,并且已经使用Control.Monad.Retry允许我在出现临时HTTP错误(例如ConnectionTimeout,{{1})时重试HTTP调用},ProxyConnectException

但是,如果由于网络异常而引发套接字级错误,例如...

ConnectionFailure

...整个过程停止,因为没有Network.Socket.recvBuf: resource vanished (Connection reset by peer) 来处理此异常。

我尝试查看Handler库使用哪种异常,我认为起作用的函数是throwSocketErrorCode,其内部使用{{3} }。

socket

因此,似乎是throwSocketErrorCode loc errno = ioError (errnoToIOError loc (Errno errno) Nothing Nothing) (正在提出IOError的类型同义词),其中也包含错误号。我假定,错误号将告诉我有关异常类型的一些信息,并据此决定是否重试或中止。但是,我找不到从IOException中提取errorNo的方法。

那么,如何捕获此类网络错误并决定重试还是中止?

1 个答案:

答案 0 :(得分:0)

没有这样做的“标准”方法,因为IOException类型在标准中是不透明的。但是,幸运的是,它的构造函数和字段是从GHC.IO.Exception导出的,因此您仍然可以分析其IOErrorType和errno。