2010-09-22 140 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