Jeśli możesz uruchomić kod w ghci, to debugger może zrobić wszystko, co chcesz.Oto program, który podnosi wyjątek
foo s i
| i == 57 = read s
| otherwise = i
main = mapM_ (print . foo "") [1..100]
Teraz załadować je do ghci i używać debuggera, co zostało udokumentowane tutaj: 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>
Pozwala obejść w historii oceny, podkreśla rzeczywisty wyrażenie, które podniosło wyjątek (pogrubiony zamiast oznaczonego gwiazdką na terminalu) i pozwala sprawdzić lokalne zmienne.
Inną opcją jest przekompilować z profilowaniem i niektóre flagi, aby oznaczyć odpowiednie MPK i uruchomić z -xc opcji profilowania która drukuje środkowy stos na koszt Uncaught wyjątkami 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
Powodem tego jest nieco trudniej jest opisana nieco wcześniej na stronie debuggera: Zasadniczo, wydajna realizacja Haskella nie używa niczego przypominającego zwykły stos wywołań, więc aby uzyskać ten rodzaj informacji na temat wyjątku, musisz działać w jakimś specjalnym trybie (debugowanie lub profilowanie), które to zachowuje rodzaj informacji.
Lepiej jest po prostu całkowicie unikać częściowych funkcji. Zamiast tego użyj "Safe.readMay". –
zobacz [tutaj] (http://stackoverflow.com/questions/8595077/how-can-i-get-position-where-error-was-called) dla lepszego rozwiązania – Simon