Scala Future.failed выдает переданное ему исключение

Я использую конструктор Future.failed для создания неудавшегося будущего, но неудачное будущее по-прежнему выдает исключение, когда я думаю, что этого не должно быть.

Метод session.loadAll вызывает исключение.

Я также использую Play Framework

Future.failed создает изображение исключения

Это происходит даже при использовании блока try-catch введите здесь описание изображения


person vicaba    schedule 01.04.2016    source источник
comment
Я совершенно не понимаю, что вы спросили. Метод loadAll выдает исключение, ОК, сопоставление с образцом перехватывает его, ОК, затем вы возвращаете еще один Future.failed, заключающий в себе новый Exception, ОК. В чем проблема? И что со скринами?   -  person slouc    schedule 01.04.2016
comment
@slouc Мое намерение состоит в том, чтобы вернуть Future, обертывающее исключение, как вы сказали, проблема в том, что вместо возврата будущего создается исключение. Именно это я и пытаюсь показать с помощью изображений. Приложение не должно падать, потому что исключение не выдается (или, по крайней мере, это то, чего я хочу, заключая исключение в будущее)   -  person vicaba    schedule 01.04.2016
comment
Ага, понятно. Но часть Future.failed(new Exception()) определенно не та, которая вызывает исключение. Что-то еще есть. Возможно, часть, использующая результат getThings, не ожидает неудачного будущего (хотя я не уверен, почему в этом случае компилятор выводит исключение в строке 44). В моем комментарии к снимкам экрана говорилось, что вы всегда должны публиковать фрагменты кода, а не изображения.   -  person slouc    schedule 01.04.2016
comment
@slouc Вы правы, проблема с потребителем   -  person vicaba    schedule 01.04.2016


Ответы (2)


Я думаю, что Future.failed не генерирует исключение. Похоже, что это так, потому что трассировка стека генерируется в том месте, где создается исключение.

Таким образом, если вы используете такой метод, как Await.result, или другой метод, который предполагает, что будущее успешно, вы увидите повторное создание исключения, но трассировка стека заставит его выглядеть так, как если бы оно было создано. в Future.failed.

person Owen    schedule 01.04.2016
comment
Await.result обычно не рекомендуется, так как это блокирующий вызов. Если блокировка не требуется, Future.onComplete или Future.onFailure будут следовать асинхронному шаблону и будут такими же или лучше. docs.scala-lang.org/overviews/core/futures.html далее поясняет, почему это плохая идея - person pgoggijr; 01.04.2016

Во-первых, я не совсем понимаю, почему вы используете здесь будущее, потому что это не похоже на асинхронные вызовы.

Однако, чтобы ответить на ваш вопрос, я не совсем уверен, что здесь происходит, но похоже, что вам нужно обработать исключение. Потребитель будущего должен использовать либо Future.onComplete и сопоставление шаблона с типом сбоя, либо Future.onFailure и сопоставление шаблона для типов Throwable.

Документация по Scala Future: http://docs.scala-lang.org/overviews/core/futures.html

person pgoggijr    schedule 01.04.2016
comment
Вы правы, проблема с потребителем, он не обрабатывал исключение - person vicaba; 01.04.2016