2010-10-24 24 views
8

Bir programda tüm istisnaları yakalamak ve açık bir şekilde basmak istiyorum (nihayetinde istisnaları görmeye devam edebilmek için).Scala'da yazdırmak için bir istisna yığın yığını nasıl alınır?

 

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

Ama bu (getStackTrace kullanarak) kendisi neden olur:

Yani bu denedim "java.lang.OutOfMemoryError: PermGen boşluk". Neyi yanlış yapıyorum? Bunu elde etmeden önce bol miktarda ücretsiz JVM yığın belleği olduğundan eminim (programın başında bir istisna oluşturmaya çalıştım).

+0

istisna ne tür 'try' atıldı blok? –

+0

@larsmans, bu bir IllegalArgumentException ve ben kendi başıma atacağım. – Ivan

+0

Scala 2.7.x veya Scala 2.8.x kullanıyor musunuz? – soc

cevap

2

Daha fazla permgen boşluğu ayırmanız gerektiği gibi görünüyor. Java'da bir JVM argümanı ile bunu: Ben tam olarak bir, tek başına çalışma sonrası gerektiğini düşünüyorum

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

Bence bu doğru bir cevap değil. Çünkü bu parametrenin değiştirilmemiş olması (varsayılan olarak 256m, AFAIK) ve bir istisna atmadan önce çok az bellek kullanıyorum. Sorun, yalnızca Exception.getStackTrace öğesine erişmeye çalışırsam oluşur. – Ivan

+0

Daha büyük bir şeye ayarlamayı denediniz mi? Kesinlikle bir yığın izi alma, permgen uzayınızı tüketiyor gibi görünüyor, ama belki de yığın izini inceleyebileceğiniz noktaya hafızayı artırabilirseniz, neler olup bittiğine dair biraz bilgi edinebilirsiniz. –

+0

Eğer istisna alamıyorsam, (yığın izleme dahil) doğru şekilde basılmış ve aklı başında görünüyor. Ancak bu - "eğer hafızayı yığın izini gerçekten inceleyebileceğiniz noktaya kadar yükseltebilirseniz neler olup bittiğine dair bir kavrayış elde edersiniz" - rasyonel sesler, fikir için teşekkürler. – Ivan

5

: Sen JVM args ayarlayabilirsiniz

-XX:MaxPermGen=256m 

bir ortam değişkeni ayarlayarak Scala tarafından kullanılmak üzere Eğer kendiolan bir istisna olup olmadığını merak ediyorum

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 

: Bu örnek, bu beni (yani sergiler hafıza hiç sorunlar) 2.8.0 kullanmak için çalıştığı için? Tersine bu program belleğe (32Mb is the default on a client-class machine by the way) üzerindeki doldu olduğu durumda olabilir ve çok derin yığını var (Scala-arazi nadir değildir!)

İlgili konular