2010-10-24 19 views
8

En un programa mío, me gustaría capturar todas las excepciones e imprimirlas explícitamente (para poder seguir adelante sin dejar de ver las excepciones).¿Cómo obtener el rastro de pila de una excepción en Scala para imprimirlo?

Así que ha intentado esto:

 

try { 
    ... 
} 
catch { 
    case ex : Exception => { 
    println ("\n" + ex) 
    println ("\n" + ex.getStackTrace + "\n") 
    } 
} 
finally { 
    ... 
} 
 

Pero esto (usando getStackTrace) en sí causa "java.lang.OutOfMemoryError: PermGen espacio". ¿Qué estoy haciendo mal? Estoy seguro de que tengo un montón de libre memoria JVM libre antes de obtener esto (ya que he intentado causar una excepción desde el principio del programa).

+0

¿Qué tipo de excepción fue lanzado en el 'try' ¿bloquear? –

+0

@larsmans, es una excepción de campaña ilegal y la tiro por mi cuenta. – Ivan

+0

¿Utiliza Scala 2.7.xo Scala 2.8.x? – soc

Respuesta

2

Parece que necesita asignar más espacio permgen. En Java lo hace con un argumento JVM:

-XX:MaxPermGen=256m 

Puede establecer argumentos de JVM para ser utilizado por Scala estableciendo una variable de entorno:

JAVA_OPTS="-XX:MaxPermGen=256m" 
+0

Creo que esta no es una respuesta correcta. Porque tengo este parámetro inalterado (es 256m por defecto, AFAIK) y uso muy poca memoria antes de lanzar una excepción. El problema solo ocurre si trato de acceder a Exception.getStackTrace. – Ivan

+0

¿Has intentado configurarlo para algo más grande? Ciertamente parece sospechoso que obtener un rastro de la pila esté agotando su espacio permgen, pero tal vez si puede aumentar la memoria hasta el punto donde realmente puede examinar el seguimiento de la pila, podrá obtener una idea de lo que está sucediendo. –

+0

Si no encuentro una excepción, esta (incluido el seguimiento de la pila) se imprime correctamente y se ve en buen estado. Pero esto - "tal vez si puedes aumentar la memoria hasta el punto en que puedes examinar el trazado de la pila, podrás obtener una idea de lo que está pasando" - suena racional, gracias por la idea. – Ivan

5

Creo que usted debe enviar una copia exacta, de trabajo autónomo ejemplo de esto porque esto funciona para mí usando 2.8.0 (es decir, no exhibe problemas de memoria en absoluto):

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 

me pregunto si usted tiene una excepción que es su propia cause? A la inversa, puede darse el caso de que su programa es corriendo muy poca memoria (32Mb is the default on a client-class machine by the way) y tiene una pila muy profundo (no es infrecuente en Scala-tierra!)

Cuestiones relacionadas