web-dev-qa-db-ja.com

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]
35
yzernik

「ボックス化エラー」は、Error内でスローされるFutureに対するScalaの応答です。 JavaおよびScalaでは、Error型のサブクラスはFatalエラーとして特別な意味を持ちます。 例外とエラーの違い を参照してください。つまり、javadocは次のように述べています。

ErrorはThrowableのサブクラスであり、妥当なアプリケーションがキャッチしようとしてはならない重大な問題を示します。このようなエラーのほとんどは異常な状態です。

将来的に他のThrowablesをスローするのとは異なり、Errorのサブクラスがスローされると、デフォルトのScalaリゾルバーはErrorをラップしますa _Java.util.concurrent.ExecutionException_、メッセージ文字列「Boxed Error」を使用して、失敗して約束を完了します。

先物ドキュメントを引用するには http://docs.scala-lang.org/overviews/core/futures.html w.r.t. Errorがスローされています:

[エラー]失敗した非同期計算を実行しているスレッドで例外が再スローされます。これの背後にある理論的根拠は、通常クライアントコードで処理されない重大な制御フロー関連の例外の伝播を防ぐと同時に、将来計算が失敗したクライアントに通知することです。

失敗に対して何か特別なことをしたい場合は、ExecutionException#getCause()によって、スローされた元のErrorを抽出できます(ただし、パターンマッチングに特に適していません)。

47
mseddon

それがBoxed Errorかどうかはわかりませんが、スタックトレースによると、根本的な問題はfactorie lib、max2Doubleにあります 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は空のようです。

3
ndeverge