如何捕获 Http.Conduit 的 simpleHttp 抛出的 404 状态异常

2024-01-23

我正在尝试下载 html 文件中包含的所有 png 文件。 不过,我在捕获 404 状态异常时遇到了麻烦,相反,我的程序只是崩溃了。

这是一些示例来演示:

import Network.HTTP.Conduit
import qualified Data.ByteString.Lazy as L

main = do
    let badUrl = "http://www.google.com/intl/en_com/images/srpr/WRONG.png"    
    imgData <- (simpleHttp badUrl) `catch` statusExceptionHandler  
    L.writeFile "my.png" imgData

statusExceptionHandler ::  t -> IO L.ByteString
statusExceptionHandler e = (putStrLn "oops") >> (return L.empty)

我的“哎呀”消息永远不会打印,而是应用程序崩溃并显示:

StatusCodeException(状态{statusCode = 404,statusMessage =“未找到”})[(“Content-Type”,“text/html;charset = UTF-8”),(“X-Content-Type-Options”,“nosniff "),("日期","2012 年 1 月 27 日星期五 03:10:34 GMT"),("服务器","sffe"),("内容长度","964"),("X-XSS -保护","1;模式=阻止")]

我究竟做错了什么?

Update:

按照 Thoma 的建议,我将代码更改为以下代码片段,现在已经有了适当的异常处理。

main = do
    let badUrl = "http://www.google.com/intl/en_com/images/srpr/WRONG.png"    
    imgData <- (simpleHttp badUrl) `X.catch` statusExceptionHandler  
    case imgData of x | x == L.empty -> return () 
                      | otherwise    -> L.writeFile "my.png" imgData

statusExceptionHandler ::  HttpException -> IO L.ByteString
statusExceptionHandler (StatusCodeException status headers) = 
    putStr "An error occured during download: "
    >> (putStrLn $ show status)
    >> (return L.empty)

除了托马斯的回答之外,你还可以看出http-conduit不要通过覆盖来抛出异常checkStatus你的记录Request type.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何捕获 Http.Conduit 的 simpleHttp 抛出的 404 状态异常 的相关文章

随机推荐