如何获得有关Haskell错误发生在何处的更多信息?例如,昨天我正在编写一个Haskell程序,该程序解析输入文件,转换数据,然后输出报告信息。
有一次,我跑了“主”,然后回来了。
*** Prelude.read: parse error没有其他信息。幸运的是,我知道我只在一个地方打电话给read,并且能够修复它,但是是为了将来:
谢谢!
使用GHC编辑。
发布于 2013-01-31 19:30:29
如果您可以在ghci中运行代码,那么调试器可以执行您想做的任何事情。下面是一个引发异常的程序
foo s i
| i == 57 = read s
| otherwise = i
main = mapM_ (print . foo "") [1..100]现在将其加载到ghci中并使用调试器,如本文所述: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> 它允许您在计算历史中走动,突出显示引发异常的实际表达式(粗体而不是终端上的星号),并允许您检查局部变量。
另一种选择是使用分析和一些标志重新编译以标记适当的成本中心,并使用-xc分析选项运行,该选项在未指定的异常指南/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这有点困难的原因是在调试器页面指南/ghci-调试器.ghci#跟踪中描述的--基本上,高效的Haskell执行并不使用类似于普通调用堆栈的任何东西,因此要获得关于异常的此类信息,您必须在某种特殊模式下运行(调试或分析),这样才能保存此类信息。
发布于 2010-01-26 13:21:53
一般来说,应该由您来处理错误,以便有足够的上下文来调试原因。
Haskell的懒散性使堆栈跟踪难以实现,因为当错误发生时,调用堆栈可能不再存在。
一种简单的错误处理方法是使用任一类型,它允许您在事情顺利时返回一个值,或者使用某种上下文(错误消息、输入字符串、.)万一出了差错。
最后,在您的特定情况下,read抛出了一个异常,因此您必须捕获该异常,然后处理调用代码中的错误(查看Control.Exception包)。
发布于 2010-01-26 13:17:39
你没有告诉我们你使用的是哪个编译器。如果您使用GHC,那么您应该看看GHCi调试器。
Haskell中的堆栈跟踪并不简单,因为它很懒惰。不过,上述调试器提供了一些工具(参见2.5.5节)。(以上URL中的跟踪和历史记录)。
https://stackoverflow.com/questions/2139463
复制相似问题