Pergunta

Haskell está me givinig uma dor de cabeça hoje. Eu quero lidar com uma exceção. Quando se chega ao topo imprime assim:

*** Exceção: ../p/trip/Trip.hs:(88,16)-(89,50): padrões não exaustivas em Split função

Para mim, parece que é PatternMatchFail, mas isso não funciona:

handle (\(PatternMatchFail _) -> return env) f

Quer dizer, ele compila, mas não tratar a exceção. O que estou fazendo de errado? Não é a exceção errado ou o que? Existe uma maneira para capturar qualquer exceção?

Foi útil?

Solução

Se fixar a origem do erro não é uma opção, você deve olhar para isto: http://www.haskell.org/ ghc / docs / latest / html / bibliotecas / base / Control-Exception.html

Acredito que o uso de "pega" ou "tentativa" ou "pegar" ou qualquer que seja a partir Control.Exception é a chave aqui, as funções no prelúdio padrão apenas lidar com IO-exceções, não com erros no código puro.

Em Haskell98, código puro não pode lidar com exceções. funções puras deve retornar um valor, uma exceção é um fracasso para retornar um valor.

Exemplo:

import qualified Control.Exception as C
x ::String
x = undefined
y = "return value"

main = do C.handle (\_ -> return "caught") (C.evaluate x) >>= print
          C.handle (\_ -> return "caught") (C.evaluate y) >>= print

A chamada para avaliar é forçar a avaliação de x e y, Haskell ser preguiçoso e tudo.

Se você deixar a avaliação de x ser adiada até mais tarde (preguiçosamente), a exceção também será lançada mais tarde, em um lugar diferente (neste caso é "print" que usa o valor), onde não pode ser capturados.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top