2011-07-05 76 views
13

我目前正在調試我在Haskell中爲我的畢業論文執行的算法。這似乎對大多數投入正常工作,但我發現一個輸入,這使得GHC拋出錯誤如何顯示在Haskell中引發的錯誤的回溯

***異常:Map.find:元素在地圖上不

因爲我有很多在我的代碼中查找地圖,我需要找到引發這個錯誤的行以使其具有任何意義。我通過this guide閱讀,但我雖然設置了標誌fbreak-on-exception(和-error),所有GHCI讓我跟蹤功能後,我測試的是:

[...]> :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? 

再次嘗試:trace似乎並沒有幫助的。

那麼,有人能告訴我發生了什麼問題或提供了另一種查找違規行的方法嗎?提前致謝!

PS:我使用的GHC版本7.0.3,所以鏈接的指南應該適用。

+0

看到[這裏](http://stackoverflow.com/questions/8595077/how-can-i-get-the-position-where-error-was-called)更好的解決方案 – Simon

回答

9

也許這將幫助你

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

湖提供了包裝斷言產生源位於異常和錯誤。
...
補充道:import Debug.Trace.Location,然後用預處理程序重新編譯:

 $ 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

還有其他技巧w​​iki上,例如像使用Safe-Library

+0

謝謝哈爾! 不幸的是,Loch不再被支持,至少它不能編譯GHC的現代版本。 但我會嘗試維基鏈接中的其他方法。 –

+0

好吧,在查看Safe-Library之後,我用'findWithDefault(error「line nr」)替換了'Data.Map。(!)'的所有實例並發現了該錯誤。再次感謝! –

+1

太棒了! :)我剛剛發現http://hackage.haskell.org/package/loch-th,這似乎是基於GHC7。 – hal