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