Tôi đang cố gắng tải xuống tất cả các tệp png có trong tệp html. Tôi gặp sự cố khi bắt ngoại lệ trạng thái 404, thay vào đó chương trình của tôi chỉ bị treo.Làm thế nào tôi có thể bắt ngoại lệ trạng thái 404 được ném bởi simpleHttp của Http.Conduit
Dưới đây là một số mẫu để chứng minh:
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)
của tôi "oops" tin nhắn không bao giờ in, thay vì ứng dụng bị treo với:
StatusCodeException (Status {statusCode = 404, statusMessage = "Not Found "}) [(" Kiểu nội dung "," văn bản/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 ")]
Tôi đang làm gì sai?
Cập nhật:
Sau lời khuyên Thoma, tôi đã thay đổi mã của tôi đối với đoạn mã sau đây và bây giờ có xử lý ngoại lệ thích hợp tại chỗ.
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)
Cảm ơn bạn đã giải quyết được vấn đề của tôi. Tôi đồng ý chỉ bắt các ngoại lệ cụ thể (đó là bước tiếp theo của tôi, tôi chưa bao giờ đến đó). –