Что такое коробочная ошибка в Scala?

когда я запускаю свое приложение, браузер показывает

[ExecutionException: Boxed Error]

Он ничего не говорит о номере строки и т. д.

в консоли, у меня есть следующие

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

play.api.Application$$anon: 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$$anonfun$apply.apply(PlayDefaultUpstreamHandler.scala:326) [play_2.10.jar:2.1.1]
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$$anonfun$apply.apply(PlayDefaultUpstreamHandler.scala:324) [play_2.10.jar:2.1.1]
    at play.api.libs.concurrent.PlayPromise$$anonfun$extend1.apply(Promise.scala:113) [play_2.10.jar:2.1.1]
    at play.api.libs.concurrent.PlayPromise$$anonfun$extend1.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.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.apply(Trainer.scala:72) ~[factorie-1.0.0-M4-jar-with-dependencies.jar:na]
    at cc.factorie.optimize.OnlineTrainer$$anonfun$processExamples.apply(Trainer.scala:63) ~[factorie-1.0.0-M4-jar-with-dependencies.jar:na]

2 ответов


"Boxed Error" - это ответ Scala на Error быть брошенным в Future. В Java и, следовательно, Scala подклассы типа Error имеют особое значение как фатальная ошибки. См.различия между исключением и ошибкой. Короче говоря, javadoc говорит:

ошибка-это подкласс Throwable, который указывает на серьезные проблемы что разумное приложение не должно пытаться поймать. Большинство таких ошибки ненормальны условия.

в отличие от бросания других Throwables в будущем, когда подкласс Error выбрасывается, по умолчанию Scala resolver обернет Error на java.util.concurrent.ExecutionException, со строкой сообщения "Boxed Error" и завершите свое обещание с ошибкой.

процитировать фьючерсную документацию http://docs.scala-lang.org/overviews/core/futures.html w.r.т. Error перебрасываясь:

[ошибка] исключения перестраиваются в потоке, выполняющем сбой асинхронное вычисление. Обоснованием этого является предотвращение распространение критических исключений и исключений, связанных с регулированием потока, как правило не обрабатывается клиентским кодом и одновременно информирует клиента в каком будущем вычисление провалилось.

если вы хотите сделать что-то особенное с провалом, оригинал Error то, что было брошено, может быть извлечено (но не особенно поддается сопоставлению шаблонов), ExecutionException#getCause()


Я не знаю, что это Boxed Error, но согласно вашему stacktrace, корневая проблема исходит из 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 пусто.