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