Вы действительно должны избегать таких ошибок с помощью общих функций. Затем, если функция может возвращать ошибку, ее тип возврата должен быть Either e a
, где e
является типом исключения, а a
- успешный тип. Если вам не нужно передавать какую-либо информацию об исключении, вы можете просто вернуть Maybe a
.
Это сказал Control.Exception
имеет некоторые возможности для ловли ошибок с помощью try
или catch
, за счет только быть в состоянии сделать такую обработку в IO
монады. В GHCi вы можете увидеть это:
ghci> import Control.Exception
ghci> catch (head []) (\msg -> putStrLn $ "caught: " ++ show (msg :: SomeException))
caught: Prelude.head: empty list
Есть [ложка] (http://hackage.haskell.org/package/spoon-0.3.1/docs/Control-Spoon.html), но это довольно хакерское и ненадежное в многопоточном контексте. Предпочтительнее всего избегать частичных функций, или если вы их используете, сначала выполните проверку работоспособности аргументов, чтобы убедиться, что ни одно исключение не возникает. – leftaroundabout