gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:24:21 25 4
gpt4 key购买 nike

我正在尝试下载包含在 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 (Status {statusCode = 404, statusMessage = "Not Found"}) [("Content-Type","text/html; charset=UTF-8"),("X-Content-Type-Options","nosniff"),("Date","Fri, 27 Jan 2012 03:10:34 GMT"),("Server","sffe"),("Content-Length","964"),("X-XSS-Protection","1; mode=block")]



我究竟做错了什么?

更新:

按照 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 的记录类型。

关于haskell - 如何捕获 Http.Conduit 的 simpleHttp 抛出的 404 状态异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9028636/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com