2010-09-22 11 views
10

Esiste un modo per forzare l'interprete Scala (avviato tramite SBT) per stampare la traccia dello stack completo. Per impostazione predefinita, vengono visualizzati meno di 10 righe:
Come forzare l'interprete a mostrare la traccia di stack completa?

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... 

Come una soluzione che sto utilizzando try { new CacheMonitoringClient } catch { case ex => ex.printStackTrace} (avvolgendo in modo esplicito le chiamate che gettano le eccezioni che mi interessano), ma che davvero brutto ...

risposta

17

Usa lastException se si desidera solo una cosa:

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) 

O impostare settings.maxPrintString-0, anche se questo cambierà come i risultati normali sono stampati troppo.

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, questi suggerimenti e trucchi REPL sono documentati da qualche parte? – missingfaktor

+0

@Missing Fai attenzione a paulp su mailing lists e irc, e a volte mostrerà qualche nuovo trucco che ha implementato. Oltre a questo, basta premere '' e vedere cosa c'è, vedere quali metodi sono implementati, andare in modalità risparmio energia e ripetere, ecc. –

0

hai provato

trace on 

in SBT prima di entrare nella console? On è l'impostazione predefinita, ma forse viene sovrascritta nel tuo caso.

+0

Provato contro SBT 0.7.4. Nessuna differenza con la traccia on/off: in entrambi i casi, la traccia dello stack viene visualizzata e tagliata. –

+0

Sì, l'ho provato da solo (dovevo installare prima). Anche provato l'opzione traccia ma non c'è differenza. Mi dispiace per l'aringa rossa. – Synesso

+0

Osservo che il REPL troncherà anche le eccezioni al di fuori di un contesto SBT, quindi potrebbe non essere SBT a farlo. – Synesso