2011-07-05 18 views
13

Actualmente estoy depurando un algoritmo que implementé en Haskell para mi tesis de Diploma. Parece que funciona correctamente para la mayoría de los insumos, sin embargo, me encontré con una entrada que hace GHC tirar el errorCómo mostrar una traza inversa para un Error arrojado en Haskell

*** Excepción: Map.find: Elemento no en el mapa

Como tengo muchos Búsqueda de mapas en mi código, necesito encontrar la línea que arroje este error para darle sentido. He leído a través this guide, pero aunque me puse la bandera fbreak-on-exception (y -error), todos GHCi me da después de trazar la función Soy la prueba es:

[...]> :trace test 
[...] 
Stopped at <exception thrown> 
_exception :: 
    e = GHC.Exception.SomeException (GHC.Exception.D:Exception _ 
                 (GHC.Show.D:Show ...) ....) 
           (GHC.Exception.ErrorCall ['M',....]) 
Unable to list source for <exception thrown> 
Try rerunning with :trace, :back then :list 
[<exception thrown>] [...]> :history 
Empty history. Perhaps you forgot to use :trace? 

Tratando :trace nuevo no parece ayudar a cualquiera.

Entonces, ¿alguien me puede decir lo que está pasando u ofrecer otra forma de encontrar la línea ofensiva? ¡Gracias por adelantado!

PD: Estoy usando la versión 7.0.3 de GHC, por lo que debe aplicarse la guía vinculada.

+0

ver [aquí] (http://stackoverflow.com/questions/8595077/how-can-i-get-the-position-where-error-was-llamado) para una mejor solución – Simon

Respuesta

9

Tal vez esto le ayudará a

http://www.haskell.org/haskellwiki/Debugging

Loch proporciona envolturas sobre afirman para la generación de excepciones y errores de código-situado.
...
añadiendo: import Debug.Trace.Location y luego volver a compilar con el preprocesador en:

 $ ghc A.hs --make -pgmF loch -F -no-recomp 
    [1 of 1] Compiling Main    (A.hs, A.o) 
    Linking A ... 
    $ ./A 
    A: A.hs:14:14-19: Maybe.fromJust: Nothing

También hay otros consejos sobre la wiki, como por ejemplo, usando el Safe-Library.

+0

Gracias Hal! Desafortunadamente, Loch ya no parece ser compatible, al menos no se compila en las versiones modernas de GHC. Pero intentaré los otros métodos en su enlace Wiki. –

+0

Bien, después de mirar Safe-Library, reemplacé todas las instancias de 'Data.Map. (!)' Con 'findWithDefault (error" line nr ")' y encontré el error. ¡Gracias de nuevo! –

+1

¡Genial! :) Acabo de encontrar http://hackage.haskell.org/package/loch-th, que parece estar basado en GHC7. – hal

Cuestiones relacionadas