Как перехватить исключение состояния 404 выброшенный simpleHttp из Http.Conduit

Я пытаюсь загрузить все файлы png, содержащиеся в файле html. У меня проблемы с отловом исключения статуса 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- Введите "," 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")]

Что я делаю не так ?

Обновление:

Следуя совету Томы, я изменил свой код на следующий фрагмент, и теперь у меня есть правильная обработка исключений.

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)
6
задан Uli Köhler 23 January 2014 в 15:13
поделиться