Что такое ошибка в коробке в 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]
Ответы
Ответ 1
"Ошибка в ящике" - это Scala ответ на Error
, который вызывается внутри Future
. В Java и, следовательно, Scala подклассы типа Error
имеют особое значение как фатальные ошибки. См. Различия между Исключением и Ошибка. Короче говоря, javadoc говорит:
Ошибка - это подкласс Throwable, который указывает на серьезные проблемы что разумное приложение не должно пытаться поймать. Большинство таких ошибки являются ненормальными условиями.
В отличие от бросания другого Throwable
в будущем, когда подкласс Error
вызывается, по умолчанию Scala resolver завершает Error
в java.util.concurrent.ExecutionException
, со строкой сообщения "Boxed Error", и завершите свое обещание неудачей.
Процитировать фьючерсную документацию http://docs.scala-lang.org/overviews/core/futures.html w.r.t. Error
:
Исправлены ошибки [Error] в потоке, выполняющем неудачные асинхронное вычисление. Обоснованием этого является предотвращение распространение критических и связанных с контролем потоков исключений обычно не обрабатывается клиентским кодом и в то же время информирует клиента в котором будущее вычисление не удавалось.
Если вы хотите сделать что-то особенное с ошибкой, исходный Error
, который был выброшен, может быть извлечен (но не таким образом, в частности, поддается сопоставлению с образцом), ExecutionException#getCause()
Ответ 2
Я не знаю, что a 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
пуст.