2013-12-13 3 views
10

Scala Stack-Traces sind notorisch komplex, vor allem wegen der Art, wie anonyme Funktionen in Bytecode übersetzt werden. Hier ist ein Beispiel:"Besser" Scala Stack Spuren

java.lang.IllegalStateException 
    at com.company.IdentityVerifier$$anonfun$go$2$$anonfun$apply$2.apply$mcII$sp(IdentityVerifier.scala:19) 
    at com.company.IdentityVerifier$$anonfun$go$2$$anonfun$apply$2.apply(IdentityVerifier.scala:17) 
    at com.company.IdentityVerifier$$anonfun$go$2$$anonfun$apply$2.apply(IdentityVerifier.scala:17) 
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244) 
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244) 
    at scala.collection.immutable.List.foreach(List.scala:318) 
    at scala.collection.TraversableLike$class.map(TraversableLike.scala:244) 
    at scala.collection.AbstractTraversable.map(Traversable.scala:105) 
    at com.company.IdentityVerifier$$anonfun$go$2.apply(IdentityVerifier.scala:17) 
    at com.company.IdentityVerifier$$anonfun$go$2.apply(IdentityVerifier.scala:16) 
    at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:251) 
    at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:251) 
    at scala.collection.immutable.List.foreach(List.scala:318) 
    at scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:251) 
    at scala.collection.AbstractTraversable.flatMap(Traversable.scala:105) 
    at com.company.IdentityVerifier$.go(IdentityVerifier.scala:16) 
    at com.company.UserMap.setLastUserId(UserMap.scala:12) 
    at com.company.UserConsumer.setCurrentUser(UserConsumer.java:69) 
    at com.company.UserConsumer.consume(UserConsumer.java:64) 
    at com.company.UserProducer.execute(UserProducer.java:19) 
    at com.company.UserCreator.execute(UserCreator.java:18) 
    at com.company.UserCreatorMain$1.run(UserCreatorMain.java:37) 
    at com.company.UserCreatorMain.main(UserCreatorMain.java:51) 

habe ich da gefunden stackifier (es ist ihr Beispiel), aber es ist umständlich Einfügen von Stack-Traces auf eine Webseite zu halten. Gibt es eine Möglichkeit, "bessere" Stack-Traces auf der Konsole zu drucken?

+0

Wie ist der Stack-Trace komplex? Es teilt Ihnen die Zeile mit, in der die Ausnahme aufgetreten ist. – vptheron

+0

@vptheron Der Punkt eines Stack-Trace ist nicht nur die Zeile, in der die Ausnahme aufgetreten ist, sondern auch * wie sie dorthin gelangt ist *. "Complex" ist meist subjektiv - für mich bedeutet "$$ anonfun $ go $ 2 $ $ anonfun $ apply $ 2" keine nützlichen Informationen, auch keine 5 Zeilen für eine einfache 'flatMap'. Obwohl es sicherlich interessant ist, einen Blick auf Scala's Interna zu werfen, würde ich die meiste Zeit lieber verstehen, was schiefgelaufen ist. Schnell. – goncalopp

+3

Technisch gesehen ist das Problem mit dieser Scala-Stack-Ablaufverfolgung, dass es sich nicht um eine Scala-Stack-Ablaufverfolgung handelt, sondern um eine Java-Stack-Ablaufverfolgung. Hilft dir aber nicht. –

Antwort

4

IntelliJ IDEA hilft, auch im Fall, dass Sie nicht den Code debuggen (und das scala Plugin sollte auch mit der Community-Version arbeiten):

http://www.jetbrains.com/idea/webhelp/analyzing-external-stacktraces.html

Sie eine anklickbare Stack-Trace erhalten, die Sprünge der richtige Ort.

Ich fragte auf ScalaIDE Foren, ob ScalaIDE dies auch tut. Mirco Dotta ninja-geantwortet:

Ja, es ist, aber es ist nicht die einfachste Funktion in Eclipse zu finden. Sie müssen open the "Java StackTrace Console"

nicht über Emacs gefragt haben, bitte jemand in Chip.

Auch, versuchen Sie es zu bedenken, dass „kryptische“ Namen (go C++ Namen Mangeln sehen) ist ein Preis, den Sie bezahlen zusätzliche Flexibilität.

Verwandte Themen