Компьютерный форум

Компьютерный форум (http://www.hardforum.ru/)
-   Haskell (http://www.hardforum.ru/f222/)
-   -   Как правильно обработать ошибку? (http://www.hardforum.ru/t102489/)

Q0i 01.09.2012 01:13

Как правильно обработать ошибку?
 
Доброго времени суток.

Данная программа открывает file.txt и обрабатывает содержащиеся в нём строки по очереди.

haskell Код:
import qualified Control.Exception as Exc

main = do
    contents <- readFile "file.txt"
    let
        arr_lines = lines contents
        sum = foldl processLine 0 arr_lines
    print sum
   
processLine :: Int -> String -> Int
processLine sum line = sum + ( length $ tail $ drop 3 line )

При обработке строки может произойти ошибка - вызов tail на пустом списке.
В более сложных примерах функция processLine может иметь несколько причин для сбоев.
Нужно сделать так, чтобы при возникновении ошибки в processLine программа печатала на экран проблемную строку line.

Первое что приходит в голову - использовать исключения.
Однако мне не понятно, как их сюда засунуть.
Судя по описанию API исключения обязательно должны работать непосредственно с IO-монадой.
Например,
Control.Exception.catch :: Exception e => IO a -> (e -> IO a) -> IO a
Данная программа работает под IO-монадой, однако ошибка возникает в функции processLine, которая про монаду ничего не знает.
Генерировать исключение надо именно в processLine, так как уровнем выше проблемная строка line уже не доступна.

Как решить эту проблему?


Часовой пояс GMT +4, время: 21:06.

Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.