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

如何捕获Haskell中的临时套接字错误并从中恢复?,haskell,Haskell,我正在HTTP API上运行一个大规模的scrape作业,并且已经使用了Control.Monad.Retry来允许我在出现临时HTTP错误时重试HTTP调用,例如,ConnectionTimeout,ProxyConnectException,ConnectionFailure) 但是,如果由于网络中的漏洞而引发套接字级别错误,例如 Network.Socket.recvBuf: resource vanished (Connection reset by peer) …整个过程将停止,因为

我正在HTTP API上运行一个大规模的scrape作业,并且已经使用了
Control.Monad.Retry
来允许我在出现临时HTTP错误时重试HTTP调用,例如,
ConnectionTimeout
ProxyConnectException
ConnectionFailure

但是,如果由于网络中的漏洞而引发套接字级别错误,例如

Network.Socket.recvBuf: resource vanished (Connection reset by peer)
…整个过程将停止,因为无论此异常是什么,都没有适当的
处理程序

我已经试着研究了
socket
库使用了什么样的异常,我认为正在使用的函数是内部使用的

因此,它看起来像是一个
IOError
(正在引发
IOException
的类型同义词),其中也包含一个错误号。我假设错误号将告诉我有关异常类型的信息,在此基础上,我将能够决定是重试还是中止。但是,我找不到从
IOException
中获取错误号的方法


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

没有“标准”的方法来执行此操作,因为标准中的
IOException
类型是不透明的。然而,幸运的是,它的构造函数和字段是从导出的,因此您将能够分析它的
IOErrorType
和errno。

类似于
catch操作(\e->if(ioe\u type e==resourceensed),那么doRetryThing else doFailThing)
是否导出了
IOException
的构造函数?我错过了那个简单的事情吗?
Prelude>import GHC.IO.Exception
<代码>前奏曲GHC.IO.Exception>:i IOException
。。。是的,好像是出口的。
throwSocketErrorCode loc errno =
    ioError (errnoToIOError loc (Errno errno) Nothing Nothing)