2010-09-22 138 views
10

有什麼辦法強制Scala解釋器(通過SBT啓動)打印完整的堆棧跟蹤。默認情況下,將顯示10行以內:
如何強制解釋器顯示完整的堆棧跟蹤?

scala> new CacheMonitoringClient 
javax.management.InstanceNotFoundException: com.bea:Name=DomainRuntimeService,Type=weblogic.management.beanservers.domainrun 
time.DomainRuntimeServiceMBean 
     at weblogic.rjvm.ResponseImpl.unmarshalReturn(ResponseImpl.java:195) 
     at weblogic.rmi.internal.BasicRemoteRef.invoke(BasicRemoteRef.java:224) 
     at javax.management.remote.rmi.RMIConnectionImpl_921_WLStub.getAttribute(Unknown Source) 
     at weblogic.management.remote.common.RMIConnectionWrapper$11.run(ClientProviderBase.java:498) 
     at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:363) 
     at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:147) 
     at weblogic.security.Security.runAs(Security.java:61) 
     at weblogic.management.remote.common.RMIConnectionWrapper.getAttribute(ClientProviderBas... 

由於我使用try { new CacheMonitoringClient } catch { case ex => ex.printStackTrace}(包裝明確拋出我感興趣的例外調用)一種解決方法,但真難看......

回答

17

使用lastException如果你想的只有一件事:

scala> 1/0 
java.lang.ArithmeticException:/by zero 
    at .<init>(<console>:12) 
    at .<clinit>(<console>) 
    at RequestResult$.<init>(<console>:9) 
    at RequestResult$.<clinit>(<console>) 
    at RequestResult$scala_repl_result(<console>) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at scala.tools.nsc.Interpreter$Request$$anonfun$loadAndRun$1$$anonfun$apply$18.apply(Interpreter.scala:981) 
    at scala.tools.nsc.Interpreter$Request$$anonfun$loadAndRun$1$$anonfun$apply$18.apply(Interpreter.scala:981) 
    at scala.util.control.Exception$Catch.apply(Exception.scala:79) 
    at scal... 
scala> lastException.printStackTrace 
java.lang.ArithmeticException:/by zero 
    at line101$object$$iw$$iw$$iw$$iw$$iw$$iw$.<init>(<console>:12) 
    at line101$object$$iw$$iw$$iw$$iw$$iw$$iw$.<clinit>(<console>) 
    at RequestResult$line101$object$.<init>(<console>:9) 
    at RequestResult$line101$object$.<clinit>(<console>) 
    at RequestResult$line101$object.scala_repl_result(<console>) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at scala.tools.nsc.Interpreter$Request$$anonfun$loadAndRun$1$$anonfun$apply$18.apply(Interpreter.scala:981) 
    at scala.tools.nsc.Interpreter$Request$$anonfun$loadAndRun$1$$anonfun$apply$18.apply(Interpreter.scala:981) 
    at scala.util.control.Exception$Catch.apply(Exception.scala:79) 
    at scala.tools.nsc.Interpreter$Request$$anonfun$loadAndRun$1.apply(Interpreter.scala:980) 
    at scala.tools.nsc.Interpreter$Request$$anonfun$loadAndRun$1.apply(Interpreter.scala:980) 
    at scala.util.control.Exception$Catch.apply(Exception.scala:79) 
    at scala.tools.nsc.Interpreter$Request.loadAndRun(Interpreter.scala:979) 
    at scala.tools.nsc.Interpreter.loadAndRunReq$1(Interpreter.scala:578) 
    at scala.tools.nsc.Interpreter.interpret(Interpreter.scala:597) 
    at scala.tools.nsc.Interpreter.interpret(Interpreter.scala:575) 
    at scala.tools.nsc.InterpreterLoop.reallyInterpret$1(InterpreterLoop.scala:471) 
    at scala.tools.nsc.InterpreterLoop.interpretStartingWith(InterpreterLoop.scala:514) 
    at scala.tools.nsc.InterpreterLoop.command(InterpreterLoop.scala:361) 
    at scala.tools.nsc.InterpreterLoop.processLine$1(InterpreterLoop.scala:242) 
    at scala.tools.nsc.InterpreterLoop.repl(InterpreterLoop.scala:248) 
    at scala.tools.nsc.InterpreterLoop.main(InterpreterLoop.scala:558) 
    at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:72) 
    at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala) 

或者設置settings.maxPrintString爲0,儘管這將改變正常的打印結果了。

scala> settings.maxPrintString = 0 

scala> 1 /0 
java.lang.ArithmeticException:/by zero 
    at .<init>(<console>:12) 
    at .<clinit>(<console>) 
    at RequestResult$.<init>(<console>:9) 
    at RequestResult$.<clinit>(<console>) 
    at RequestResult$scala_repl_result(<console>) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at scala.tools.nsc.Interpreter$Request$$anonfun$loadAndRun$1$$anonfun$apply$18.apply(Interpreter.scala:981) 
    at scala.tools.nsc.Interpreter$Request$$anonfun$loadAndRun$1$$anonfun$apply$18.apply(Interpreter.scala:981) 
    at scala.util.control.Exception$Catch.apply(Exception.scala:79) 
    at scala.tools.nsc.Interpreter$Request$$anonfun$loadAndRun$1.apply(Interpreter.scala:980) 
    at scala.tools.nsc.Interpreter$Request$$anonfun$loadAndRun$1.apply(Interpreter.scala:980) 
    at scala.util.control.Exception$Catch.apply(Exception.scala:79) 
    at scala.tools.nsc.Interpreter$Request.loadAndRun(Interpreter.scala:979) 
    at scala.tools.nsc.Interpreter.loadAndRunReq$1(Interpreter.scala:578) 
    at scala.tools.nsc.Interpreter.interpret(Interpreter.scala:597) 
    at scala.tools.nsc.Interpreter.interpret(Interpreter.scala:575) 
    at scala.tools.nsc.InterpreterLoop.reallyInterpret$1(InterpreterLoop.scala:471) 
    at scala.tools.nsc.InterpreterLoop.interpretStartingWith(InterpreterLoop.scala:514) 
    at scala.tools.nsc.InterpreterLoop.command(InterpreterLoop.scala:361) 
    at scala.tools.nsc.InterpreterLoop.processLine$1(InterpreterLoop.scala:242) 
    at scala.tools.nsc.InterpreterLoop.repl(InterpreterLoop.scala:248) 
    at scala.tools.nsc.InterpreterLoop.main(InterpreterLoop.scala:558) 
    at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:72) 
    at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala) 
+1

+1,這些REPL提示和技巧是否記錄在某處? – missingfaktor 2010-09-22 19:59:59

+0

@Missing請關注郵件列表和irc上的paulp,他有時會炫耀他實施的一些新技巧。除此之外,只需按下''看看裏面有什麼,看看實現了什麼方法,進入電源模式並重復等等。 – 2010-09-22 22:18:37

0

你有沒有進入控制檯前SBT試圖

trace on 

? On是默認設置,但也許在您的情況下會被覆蓋。

+0

對SBT 0.7.4進行了試驗。跟蹤開/關沒有區別 - 在這兩種情況下,堆棧跟蹤都會顯示和剪切。 – 2010-09-22 11:15:08

+0

是的,只是自己試了一下(不得不先安裝)。還嘗試了追蹤選項,但沒有區別。對不起,紅鯡魚。 – Synesso 2010-09-22 11:21:40

+0

我注意到REPL也會截斷SBT上下文之外的異常,所以它可能不是SBT這樣做的。 – Synesso 2010-09-22 11:32:17