Чистый код может выдавать асинхронные, неточные исключения , например, когда частичная функция встречает ввод, у нее нет регистра для обработки.
Это логические ошибки, обычно указывающие на ошибки вспецификация программы.
Они могут быть перехвачены в коде ввода-вывода (обычно на внешнем уровне программы) через обработчик исключений .
Например, для перехватаваш пропавший регистр для пустого списка,
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE BangPatterns #-}
import Control.Exception
main = do
handle (\(e :: SomeException) -> print $ "This program as a bug: " ++ show e) $ do
let !v = foldl1 (+) ([] :: [Int])
return ()
Мы можем наблюдать, что исключение перехватывается, и программа завершается.
$ ./A
"This program as a bug: Prelude.foldl1: empty list"