2013-06-23 52 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是空的。