Bana öyle geliyor ki Haskell'deki istisnalar sadece atıldıktan hemen sonra yakalanabiliyor ve Java veya Python'da olduğu gibi propaganda edilmiyor. Bu gösteren kısa bir örnek aşağıda verilmiştir:Haskell'deki İstisnaları Yakalama
{-# LANGUAGE DeriveDataTypeable #-}
import System.IO
import Control.Monad
import Control.Exception
import Data.Typeable
data MyException = NoParseException String deriving (Show, Typeable)
instance Exception MyException
-- Prompt consists of two functions:
-- The first converts an output paramter to String being printed to the screen.
-- The second parses user's input.
data Prompt o i = Prompt (o -> String) (String -> i)
-- runPrompt accepts a Prompt and an output parameter. It converts the latter
-- to an output string using the first function passed in Prompt, then runs
-- getline and returns user's input parsed with the second function passed
-- in Prompt.
runPrompt :: Prompt o i -> o -> IO i
runPrompt (Prompt ofun ifun) o = do
putStr (ofun o)
hFlush stdout
liftM ifun getLine
myPrompt = Prompt (const "> ") (\s -> if s == ""
then throw $ NoParseException s
else s)
handleEx :: MyException -> IO String
handleEx (NoParseException s) = return ("Illegal string: " ++ s)
main = catch (runPrompt myPrompt()) handleEx >>= putStrLn
programını çalıştırdıktan sonra, sadece bastığınızda hiçbir şey yazmak whithout, görmek gerekiyordu [Enter]: çıktıda Illegal string:
. Bunun yerine prog: NoParseException ""
görünür. Şimdi, Prompt
tipi ve runPrompt
işlevinin, modülün dışındaki ortak kitaplıkta tanımlandığını ve İstisnayı yapıcıya iletilen işlevlerdeki özel durumu işlemek üzere değiştirilemeyeceğini varsayalım. runPrompt
'u değiştirmeden özel durumu nasıl ele alabilirim?
İstisna işleme işlevini bu şekilde enjekte etmek için üçüncü alanı Prompt
'a eklemeyi düşündüm, ancak bu bana çirkin görünüyor. Daha iyi bir seçim var mı?
Adamım, şimdi gecenin geri kalanında konuşmam var. Çok teşekkürler. :) – Sventimir