【问题标题】:How can I get the position where error was called?如何获得调用错误的位置?
【发布时间】:2011-12-21 19:16:11
【问题描述】:

我正在寻找替换 loch(及其预处理器)的东西,因为它不能使用 ghc 7 编译。

具体来说,如果error 被调用,那么我想尽可能方便地弄清楚它是从哪里调用的(行号和堆栈跟踪会很好)。

【问题讨论】:

  • 您无法真正控制其他库在何处或何时使用error,但我个人对自己的代码的偏好是尽可能避免使用error。作为对阅读本文的任何人的一般建议,如果您需要知道代码为何采用特定的执行分支,不要使用error 来查找堆栈跟踪;现在最好的方法可能是Debug.Trace
  • @DanBurton 我认为这不适用于我的要求。假设我执行了我的程序并且意外地得到了*** Exception: Prelude.head: empty list,现在我想知道产生这个错误的head调用在源代码中的什么位置。
  • 我有一个 ghc 补丁,添加了它。我需要合并它。
  • @HaskellElephant that 的解决方案是避免您知道可能引发异常的函数。这不是一个完美的解决方案——总有一些你无法检查的代码——但它确实解决了大多数问题。
  • 考虑使用 GHCi 调试器。 See my answer here for an example.

标签: haskell


【解决方案1】:

您可以使用-xc RTS 选项,如this page 所述;您需要使用分析支持来编译您的程序,并且输出非常难看,但它可以工作。

应该这样做:

$ ghc --make -prof -auto-all myprog.hs
$ ./myprog +RTS -xc

从技术上讲,这只给出了成本中心堆栈,而不是真正的堆栈跟踪。改进的堆栈跟踪支持是coming in GHC 7.4

【讨论】:

    【解决方案2】:

    如果这是用于您正在处理的代码中,并且您可以容忍使用 Template Haskell,the placeholders package 是一种可爱而简单的方法来做这样的事情。但是,它不会帮助您找到实际的 error 表达式的位置,它只使用它自己的类似 error 的函数。

    【讨论】:

      【解决方案3】:

      使用 GHC-7 构建它非常简单。这只是 6.12 附带的 Control.Exception 更改,简单的解决方法是将 Debug.Trace.Location 第 70 行中的 Exception 类型更改为 SomeException 并在第 144 行添加表达式类型签名。限制 base 依赖到 .cabal 文件中的 >= 4.2 && < 4.6(更新版本),你就可以开始了。

      【讨论】:

        【解决方案4】:

        Control.Exception 中的assert 函数是一个快速的解决方法。但是,它比error 有点笨拙。

        警告:如果您使用优化进行编译(ghc -O1-O2 等),所有断言都将被静默忽略。

        例子:

        import Control.Exception
        
        main = do
            print (42 + (assert True  17)) -- adds 42 and 17
            print (42 + (assert False 21)) -- crashes
        

        输出:

        59
        test.hs: /tmp/test.hs:5:18-23: Assertion failed
        

        注意输出中的行号“5”。

        您可以使用 Debug.Trace 中的 trace 添加错误消息:

            print (42 + (trace "omg error" $ assert False 21))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多