我正在通过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的方法。
那么,如何捕获此类网络错误并决定重试还是中止?
答案 0 :(得分:0)
没有这样做的“标准”方法,因为IOException
类型在标准中是不透明的。但是,幸运的是,它的构造函数和字段是从GHC.IO.Exception
导出的,因此您仍然可以分析其IOErrorType
和errno。