Si puede ejecutar el código en ghci, entonces el depurador puede hacer todo lo que desee.He aquí un programa que genera una excepción
foo s i
| i == 57 = read s
| otherwise = i
main = mapM_ (print . foo "") [1..100]
Ahora cargarlo en ghci y utilizar el depurador, tal como se documenta aquí: http://www.haskell.org/ghc/docs/latest/html/users_guide/ghci-debugger.html#ghci-debugger-exceptions
> ghci test.hs
*Main> :set -fbreak-on-error
*Main> :trace main
1
2
... snipped 3 through 55 ...
56
Stopped at <exception thrown>
_exception :: e = _
[<exception thrown>] *Main> :back
Logged breakpoint at test.hs:2:15-20
_result :: a
s :: String
[-1: test.hs:2:15-20] *Main> :list
1 foo s i
2 | i == 57 = **read s**
3 | otherwise = i
[-1: test.hs:2:15-20] *Main> s
""
[-1: test.hs:2:15-20] *Main>
Se deja paso alrededor de la historia de evaluación, destaca la real expresión que generó la excepción (negrita en lugar de aparecer en un terminal) y le permite inspeccionar las variables locales.
Otra opción es volver a compilar con perfiles y algunas banderas etiquetar los centros de costos adecuados, y ejecutar con la opción de perfiles -xc que imprime la pila de centro de costos sobre las excepciones no capturadas http://www.haskell.org/ghc/docs/latest/html/users_guide/prof-time-options.html
> ghc -prof -auto-all test.hs
> ./test +RTS -cs
1
2
... snipped 3 through 55 ...
56
*** Exception (reporting due to +RTS -xc): (THUNK_2_0), stack trace:
Main.foo,
called from Main.main,
called from Main.CAF
--> evaluated by: Main.main,
called from Main.CAF
test: Prelude.read: no parse
La razón de esto es un poco difícil se describe un poco antes en la página del depurador Básicamente, la ejecución eficiente de Haskell no utiliza nada parecido a una pila de llamadas normal, por lo que para obtener ese tipo de información en una excepción debe ejecutarse en algún modo especial (depuración o creación de perfiles) que mantiene eso tipo de información.
Será mejor que evite funciones parciales por completo. Use 'Safe.readMay' en su lugar. –
ver [aquí] (http://stackoverflow.com/questions/8595077/how-can-i-get-the-position-where-error-was-llamado) para una mejor solución – Simon