首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >追踪Haskell中的错误

追踪Haskell中的错误
EN

Stack Overflow用户
提问于 2010-01-26 13:02:53
回答 4查看 3.9K关注 0票数 16

如何获得有关Haskell错误发生在何处的更多信息?例如,昨天我正在编写一个Haskell程序,该程序解析输入文件,转换数据,然后输出报告信息。

有一次,我跑了“主”,然后回来了。

代码语言:javascript
复制
*** Prelude.read: parse error

没有其他信息。幸运的是,我知道我只在一个地方打电话给read,并且能够修复它,但是是为了将来:

  • 对于这样的错误,有可能得到回溯或行号吗?
  • 是否有可能获得触发错误的实际数据,即导致解析错误的字符串?

谢谢!

使用GHC编辑

EN

回答 4

Stack Overflow用户

发布于 2013-01-31 19:30:29

如果您可以在ghci中运行代码,那么调试器可以执行您想做的任何事情。下面是一个引发异常的程序

代码语言:javascript
复制
foo s i
  | i == 57 = read s
  | otherwise = i
main = mapM_ (print . foo "") [1..100]

现在将其加载到ghci中并使用调试器,如本文所述:guide/ghci-debugger.html#ghci-debugger-exceptions

代码语言:javascript
复制
> 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上打印成本中心堆栈。

代码语言:javascript
复制
> 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执行并不使用类似于普通调用堆栈的任何东西,因此要获得关于异常的此类信息,您必须在某种特殊模式下运行(调试或分析),这样才能保存此类信息。

票数 8
EN

Stack Overflow用户

发布于 2010-01-26 13:21:53

一般来说,应该由您来处理错误,以便有足够的上下文来调试原因。

Haskell的懒散性使堆栈跟踪难以实现,因为当错误发生时,调用堆栈可能不再存在。

一种简单的错误处理方法是使用任一类型,它允许您在事情顺利时返回一个值,或者使用某种上下文(错误消息、输入字符串、.)万一出了差错。

最后,在您的特定情况下,read抛出了一个异常,因此您必须捕获该异常,然后处理调用代码中的错误(查看Control.Exception包)。

票数 3
EN

Stack Overflow用户

发布于 2010-01-26 13:17:39

你没有告诉我们你使用的是哪个编译器。如果您使用GHC,那么您应该看看GHCi调试器

Haskell中的堆栈跟踪并不简单,因为它很懒惰。不过,上述调试器提供了一些工具(参见2.5.5节)。(以上URL中的跟踪和历史记录)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2139463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档