Haskell 如何从某个异常(或任何其他自定义异常)获取stacktrace?

Haskell 如何从某个异常(或任何其他自定义异常)获取stacktrace?,haskell,exception,Haskell,Exception,今天(GHC 8.8.3+)是否可以从使用throwIO、throwM等引发的异常中提取stacktrace。我花了一个多小时查看Control.exception和GHC.Stack的文档,但找不到类型为SomeException->CallStack(或类似)的函数。我甚至试过Hoogle,但什么也找不到。没有办法,因为SomeException没有记录异常的跟踪。事实上,这是一项正在进行的GHC提案的主题: 当前,您必须手动包装异常以捕获跟踪:定义您自己的异常类型,为跟踪留出空间,并定义您

今天(GHC 8.8.3+)是否可以从使用
throwIO
throwM
等引发的异常中提取stacktrace。我花了一个多小时查看
Control.exception
GHC.Stack
的文档,但找不到类型为
SomeException->CallStack
(或类似)的函数。我甚至试过Hoogle,但什么也找不到。

没有办法,因为
SomeException
没有记录异常的跟踪。事实上,这是一项正在进行的GHC提案的主题:


当前,您必须手动包装异常以捕获跟踪:定义您自己的异常类型,为跟踪留出空间,并定义您自己的抛出函数以捕获跟踪。

正如@Li yao Xia所说,目前没有办法做您想做的事情,但有一些工作循环,其中之一是将
HasCallStack
约束添加到函数定义中:

导入GHC.Stack
head'::HasCallStack=>[a]->a
头“[]=错误“空列表”
头部’(x:uux)=x
foo::HasCallStack=>[a]->a
foo-xs=头“xs”
goo::HasCallStack=>[Int]->Int
goo(0:ux)=错误“除以零”
goo-xs=div 5(foo-xs)
hoo::HasCallStack=>[Int]->Int
hoo-xs=goo-xs+4
将上述代码加载到
ghci
,您可以跟踪调用堆栈:

ghci> foo []
*** Exception: empty list
CallStack (from HasCallStack):
  error, called at CallStack.hs:4:12 in main:Main
  head', called at CallStack.hs:8:10 in main:Main
  foo, called at <interactive>:14:1 in interactive:Ghci1
ghci> hoo [0, 1]
*** Exception: Divid by zero
CallStack (from HasCallStack):
  error, called at CallStack.hs:11:13 in main:Main
  goo, called at CallStack.hs:15:10 in main:Main
  hoo, called at <interactive>:15:1 in interactive:Ghci1
ghci>foo[]
***例外:空列表
调用堆栈(来自HasCallStack):
错误,在调用堆栈时调用。hs:4:12在main:main中
在CallStack调用head.hs:8:10在main:main中
foo,在interactive:Ghci1中于14:1呼叫
ghci>hoo[0,1]
***例外:将ID除以零
调用堆栈(来自HasCallStack):
错误,在调用堆栈时调用。hs:11:13在main:main中
goo,呼叫Stack。hs:15:10在main:main
hoo,在interactive:Ghci1中于15:1呼叫
但是,这种解决方法需要显式的代码更改来传播堆栈,这是一个缺点

还有两种其他方式:

  • 分析:
    ghc-prof-fprof auto
    ghci-fexternalinterpeter-prof
  • 矮人:
    ghc-g

有关更多信息,请参阅GHC联合开发者之一Simon Marlow的。

Aargh!我真希望情况不是这样!