如何在Scala中获取异常的堆栈跟踪并打印它?

8
在我的一个程序中,我想捕获所有异常并显式地打印它们(以便能够在仍然看到异常的情况下继续进行finally)。因此,我尝试了以下代码:但是使用getStackTrace会导致"java.lang.OutOfMemoryError: PermGen space"错误。我做错了什么?我确定在获取这个错误之前我有足够的JVM堆内存可用(因为我已经尝试在程序的开头引发异常)。

try代码块中抛出了什么类型的异常? - Fred Foo
@larsmans,这是一个非法参数异常,我自己抛出的。 - Ivan
你使用的是Scala 2.7.x还是Scala 2.8.x? - soc
2个回答

4

我认为你应该发布一个精确的、独立的工作示例,因为这对我来说在使用2.8.0时完全没有内存问题:

scala> def foo( f : () => Unit) : Unit = try {
     | f()
     | } catch { case e : Exception => println("H" + e.getStackTrace) }
foo: (f: () => Unit)Unit

scala> foo(() => throw new NullPointerException)
H[Ljava.lang.StackTraceElement;@30a4effe

我想知道你是否有一个异常它是自己的原因?相反地,你的程序可能正在非常低的内存(顺便说一下,32Mb是客户端机器上的默认值),并且您拥有非常深的堆栈(在scala-land中很常见!)


1

看起来你需要分配更多的permgen空间。在Java中,你可以使用JVM参数来实现:

-XX:MaxPermGen=256m

您可以通过设置环境变量来设置Scala使用的JVM参数:

JAVA_OPTS="-XX:MaxPermGen=256m"

我认为这不是正确的答案。因为我保持了这个参数不变(默认为256m,据我所知),并且在抛出异常之前使用非常少的内存。只有当我尝试访问Exception.getStackTrace时才会出现问题。 - Ivan
你尝试过将其设置为更大的值吗?获取堆栈跟踪会耗尽永久代空间似乎很可疑,但是如果您可以增加内存到足以实际检查堆栈跟踪的程度,也许您就能够深入了解发生了什么。 - Tom Crockett
如果我不捕获异常,它(包括堆栈跟踪)会正确打印并且看起来正常。但是这句话 - “也许如果你可以增加内存到可以实际检查堆栈跟踪的程度,你就能够获得一些关于发生了什么的见解” - 听起来很合理,谢谢这个想法。 - Ivan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接