【问题标题】:How to force interpreter show complete stack trace?如何强制解释器显示完整的堆栈跟踪?
【发布时间】:2011-04-15 15:10:29
【问题描述】:

有没有办法强制 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}(明确包装引发我感兴趣的异常的调用),但这真的很难看......

【问题讨论】:

    标签: scala interpreter sbt


    【解决方案1】:

    你试过了吗

    trace on
    

    在进入控制台之前在 SBT 中? On 是默认设置,但在您的情况下可能会被覆盖。

    【讨论】:

    • 针对 SBT 0.7.4 进行了尝试。跟踪开/关没有区别 - 在这两种情况下,堆栈跟踪都会显示和剪切。
    • 是的,我自己试过了(必须先安装)。还尝试了 trace 选项,但没有区别。对不起,红鲱鱼。
    • 我注意到 REPL 也会截断 SBT 上下文之外的异常,所以它可能不是 SBT 这样做。
    【解决方案2】:

    如果您只想要一件事,请使用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)
    

    【讨论】:

    • @Missing 继续关注邮件列表和 irc 上的 paulp,他有时会炫耀他实施的一些新技巧。除此之外,只需按&lt;TAB&gt; 看看那里有什么,看看实现了哪些方法,进入电源模式并重复,等等。
    猜你喜欢
    • 1970-01-01
    • 2010-09-27
    • 2020-06-05
    • 2016-10-05
    • 2012-07-18
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    • 2013-09-10
    相关资源
    最近更新 更多