2013-06-23 2 views
28

Quando eseguo la mia applicazione, il browser mostraChe cos'è un errore di box in Scala?

[ExecutionException: Boxed Error] 

non dice nulla circa il numero di riga, ecc

Nella console, ho il seguente

! @6elaah0c8 - Internal server error, for (GET) [/testlearn] -> 

play.api.Application$$anon$1: Execution exception[[ExecutionException: Boxed Error]] 
    at play.api.Application$class.handleError(Application.scala:289) ~[play_2.10.jar:2.1.1] 
    at play.api.DefaultApplication.handleError(Application.scala:383) [play_2.10.jar:2.1.1] 
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$17$$anonfun$apply$24.apply(PlayDefaultUpstreamHandler.scala:326) [play_2.10.jar:2.1.1] 
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$17$$anonfun$apply$24.apply(PlayDefaultUpstreamHandler.scala:324) [play_2.10.jar:2.1.1] 
    at play.api.libs.concurrent.PlayPromise$$anonfun$extend1$1.apply(Promise.scala:113) [play_2.10.jar:2.1.1] 
    at play.api.libs.concurrent.PlayPromise$$anonfun$extend1$1.apply(Promise.scala:113) [play_2.10.jar:2.1.1] 
java.util.concurrent.ExecutionException: Boxed Error 
    at scala.concurrent.impl.Promise$.resolver(Promise.scala:52) ~[factorie-1.0.0-M4-jar-with-dependencies.jar:na] 
    at scala.concurrent.impl.Promise$.scala$concurrent$impl$Promise$$resolveTry(Promise.scala:44) ~[factorie-1.0.0-M4-jar-with-dependencies.jar:na] 
    at scala.concurrent.impl.Promise$DefaultPromise.tryComplete(Promise.scala:116) ~[factorie-1.0.0-M4-jar-with-dependencies.jar:na] 
    at scala.concurrent.Promise$class.complete(Promise.scala:55) ~[factorie-1.0.0-M4-jar-with-dependencies.jar:na] 
    at scala.concurrent.impl.Promise$DefaultPromise.complete(Promise.scala:58) ~[factorie-1.0.0-M4-jar-with-dependencies.jar:na] 
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:23) [factorie-1.0.0-M4-jar-with-dependencies.jar:na] 
Caused by: java.lang.AssertionError: assertion failed 
    at scala.Predef$.assert(Predef.scala:165) ~[factorie-1.0.0-M4-jar-with-dependencies.jar:na] 
    at cc.factorie.util.TraversableExtras$class.max2ByDouble(TraversableExtras.scala:95) ~[factorie-1.0.0-M4-jar-with-dependencies.jar:na] 
    at cc.factorie.package$$anon$2.max2ByDouble(package.scala:148) ~[factorie-1.0.0-M4-jar-with-dependencies.jar:na] 
    at cc.factorie.optimize.SampleRankExample.accumulateExampleInto(SampleRank.scala:31) ~[factorie-1.0.0-M4-jar-with-dependencies.jar:na] 
    at cc.factorie.optimize.OnlineTrainer$$anonfun$processExamples$3.apply(Trainer.scala:72) ~[factorie-1.0.0-M4-jar-with-dependencies.jar:na] 
    at cc.factorie.optimize.OnlineTrainer$$anonfun$processExamples$3.apply(Trainer.scala:63) ~[factorie-1.0.0-M4-jar-with-dependencies.jar:na] 

risposta

31

"Errore casella" è la risposta di Scala a un Error lanciato all'interno di un Future. In Java, e quindi in Scala, le sottoclassi di tipo Error hanno un significato speciale come Errori irreversibili. Vedi Differences between Exception and Error. In breve, il javadoc dice:

Un errore è una sottoclasse di Throwable che indica gravi problemi che un'applicazione ragionevole non dovrebbe cercare di recuperare. La maggior parte di tali errori sono condizioni anomale.

A differenza di gettare altri Throwable s all'interno di un futuro, quando viene generata una sottoclasse di Error, il resolver Scala di default segnerà la fine della Error in un java.util.concurrent.ExecutionException, con la stringa messaggio "Errore inscatolato", e completare la promessa con un fallimento.

Per citare la documentazione sui future http://docs.scala-lang.org/overviews/core/futures.html con il numero di riferimento. Error che sono gettati:

[Errore] eccezioni vengono rilanciati nel thread in esecuzione il fallito calcolo asincrono. La logica alla base di questo è impedire la propagazione delle eccezioni relative al controllo e al flusso di controllo normalmente non gestite dal codice client e allo stesso tempo informare il client in cui il calcolo del futuro non è riuscito.

Se si vuole fare qualcosa di speciale con il fallimento, l'originale Error che è stato gettato può essere estratto (ma non in modo particolarmente suscettibili di pattern matching), da ExecutionException#getCause()

+0

Sono un po 'manca perché in primo luogo, qualsiasi "perdita" lanciata dal futuro, non dovrebbe essere l'AssertionError originale appena catturato e il callback incompleto del futuro deve essere passato a Failure (ex)? – lisak

+1

Vedo Future handling NonFatal exception, ma AssertionError è in realtà un'eccezione NonFatal, quindi dovrebbe essere catturato e passato come valore – lisak

2

Non so che è un Boxed Error, ma secondo il tuo stacktrace, il problema di root viene dalla lib factorie, dal max2Doublemethod at line 95.

Estratto dal codice sorgente:

/**Returns both the maximum element and the second-to-max element */ 
    def max2ByDouble(extractor: A => Double): (A, A) = { 
    val s1 = t.toSeq 
    assert(s1.length > 1) // <<<== HERE 
    var best1 = Double.NegativeInfinity 
    ... 

La tua Traversable è vuota.