Sto cercando di leggere un valore da un file e di rilevare tutte le eccezioni che potrebbero verificarsi (nella mentalità di "Easier to ask for forgiveness than permission"). Sto riscontrando problemi nell'ottenere l'eccezione Prelude.read: no parse
. A dire try
che dovrebbe cogliere ogni eccezione definisco tryAny
con il tipo esplicito SomeException
che a mia conoscenza è il "tipo super" di ogni eccezione:Impossibile catturare l'eccezione "Prelude.read: no parse" con Control.Exception.try
import Control.Exception (try,SomeException)
tryAny :: IO a -> IO (Either SomeException a)
tryAny = try
Con tryAny
mi sembra di essere in grado di catturare IO errori:
> tryAny (fromFile "nonExistingFileName")
Left nonExistingFileName: openFile: does not exist (No such file or directory)
Ma l'errore di lettura non sarà catturato:
> tryAny (return ((read "a")::Int))
Right *** Exception: Prelude.read: no parse
che cosa posso d o per catturare ogni eccezione?
Se si sta tentando di risolvere questo particolare problema, si consiglia di provare il pacchetto * safe *. Il [modulo sicuro] (http://hackage.haskell.org/package/safe-0.3.3/docs/Safe.html) esporta, tra le altre cose, 'readMay' che restituisce il valore letto come valore' Maybe' . – kqr
@kqr Grazie, è un buon suggerimento. Lo userò per il mio prossimo "leggere". – Perseids