2013-06-23 30 views
28

当我运行我的应用程序,浏览器显示什么是Scala中的盒装错误?

[ExecutionException: Boxed Error] 

这并不是说有关的行号什么,等

在控制台中,我有以下

! @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] 

回答

31

“盒装错误”是斯卡拉对Error的回应被引入Future。在Java和Scala中,Error类型的子类具有特殊含义,如致命错误。请参阅Differences between Exception and Error。总之,javadoc中说:

一个错误是Throwable的子类,表示严重的问题 合理的应用程序不应该试图捕获。大多数这样的 错误都是异常情况。

与未来内投掷其他Throwable年代,当时的Error一个子类抛出,默认Scala的解析器将在java.util.concurrent.ExecutionException收官Error,与消息字符串“盒装错误”,并完成你的承诺与失败。

引用期货文件http://docs.scala-lang.org/overviews/core/futures.html w.r.t. Error被抛出:

[错误]异常的线程执行失败 异步计算重新抛出。其基本原理是防止 传播与客户端代码无关的关键和控制流相关异常,通常 ,并同时通知客户端 未来计算失败。

如果你想要做一些特别的东西与失败,抛出的原始Error可以提取(而不是在一个方式特别适合于模式匹配),由ExecutionException#getCause()

+0

我有点失踪为什么任何可能从“未来”中“抛出”的东西,不应该是刚刚抓住的原始AssertionError,未来的未完成回调会通过一个失败(ex)? – lisak

+1

我看到Future处理非致命异常,但AssertionError实际上是一个非致命异常,所以它应该作为一个值被捕获并传递 – lisak

2

我不知道这是一个Boxed Error,但根据您的堆栈跟踪,根本问题来自factorie库,从max2Doublemethod at line 95。从源代码

提取物:

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

看来你Traversable是空的。