2010-10-24 27 views
8

Trong một chương trình của tôi, tôi muốn bắt tất cả các trường hợp ngoại lệ và in rõ ràng chúng (để có thể tiến hành cuối cùng trong khi vẫn thấy ngoại lệ).Làm thế nào để có được dấu vết ngăn xếp của một ngoại lệ trong Scala để in nó?

Vì vậy, tôi đã cố gắng này:

 

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

Nhưng điều này (sử dụng getStackTrace) chính nó gây ra "java.lang.OutOfMemoryError: không gian PermGen". Tôi đang làm gì sai? Tôi chắc chắn tôi có nhiều bộ nhớ miễn phí JVM heap miễn phí trước khi nhận được điều này (như tôi đã cố gắng gây ra một ngoại lệ trong phần đầu của chương trình).

+0

Loại ngoại lệ nào được ném vào 'thử' khối? –

+0

@larsmans, đó là một IllegalArgumentException và tôi tự mình ném nó. – Ivan

+0

Bạn có sử dụng Scala 2.7.x hoặc Scala 2.8.x không? – soc

Trả lời

2

Có vẻ như bạn cần phân bổ nhiều khoảng trống hơn. Trong Java bạn làm điều này với một đối số JVM:

-XX:MaxPermGen=256m 

Bạn có thể đặt args JVM được sử dụng bởi Scala bằng cách thiết lập một biến môi trường:

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

Tôi nghĩ đây không phải là câu trả lời đúng. Bởi vì tôi có tham số này không thay đổi gì (mặc định là 256m, AFAIK) và sử dụng rất ít bộ nhớ trước khi ném một ngoại lệ. Vấn đề chỉ xảy ra nếu tôi cố gắng truy cập Exception.getStackTrace. – Ivan

+0

Bạn đã thử đặt nó thành thứ gì đó lớn hơn chưa? Nó chắc chắn có vẻ giống như một ngăn xếp chồng lên nhau làm cạn kiệt không gian permgen của bạn, nhưng có lẽ nếu bạn có thể tăng bộ nhớ đến mức bạn có thể kiểm tra dấu vết ngăn xếp, bạn sẽ có thể hiểu rõ những gì đang diễn ra. –

+0

Nếu tôi không bắt ngoại lệ, nó (bao gồm cả dấu vết ngăn xếp) được in chính xác và trông lành mạnh. Nhưng điều này - "có thể nếu bạn có thể tăng bộ nhớ đến mức bạn có thể kiểm tra dấu vết ngăn xếp, bạn sẽ có thể hiểu rõ những gì đang diễn ra" - âm thanh hợp lý, cảm ơn ý tưởng. – Ivan

5

Tôi nghĩ bạn nên gửi một chính xác, làm việc độc lập ví dụ về điều này bởi vì này làm việc cho tôi sử dụng 2.8.0 (tức là triển lãm không có vấn đề bộ nhớ tại tất cả):

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 

tôi tự hỏi liệu bạn có một ngoại lệ đó là của riêng mình cause? Ngược lại, có thể trường hợp chương trình của bạn là chạy rất thấp trên bộ nhớ (32Mb is the default on a client-class machine by the way) và bạn có một ngăn xếp rất sâu (không phổ biến trong vùng đất liền!)

Các vấn đề liên quan