2013-12-22 2 views
5

Если неудача в Scala не выполняется, и нет продолжения, которое «наблюдает» за этим сбоем (или единственные продолжения используют map/flatMap и не запускаются в случае отказа), тогда ошибки остаются необнаруженными , Я бы хотел, чтобы такие ошибки регистрировались как минимум, поэтому я могу найти ошибки.Ловля необработанных ошибок в фреймах Scala

Я использую термин «наблюдаемая ошибка», потому что в .Net Tasks есть возможность поймать «незаметные исключения задачи», когда объект Task собирается GC. Аналогичным образом, с синхронными методами можно записывать нечеткие исключения, которые завершают поток.

В фьючерсах Scala для «наблюдения» отказа будет означать, что некоторое продолжение или другой код считывает Исключение, сохраненное в будущем значении, до того, как это будущее будет удалено. Я знаю, что финализация не является детерминированной или надежной, и, по-видимому, именно поэтому она не используется для обнаружения необработанных ошибок, хотя .Net делает это успешно.

Есть ли способ достичь этого в Scala? Если нет, как мне организовать мой код, чтобы предотвратить необработанные ошибки?

Сегодня у меня есть andThen checkResult, прилагаемый к различным фьючерсам. Но трудно понять, когда использовать это, а когда нет: если метод библиотеки возвращает будущее, он не должен проверять ошибки и ошибки журнала, потому что пользователь библиотеки может справиться с этим сбоем, поэтому ответственность падает на пользователя. Когда я редактирую код, мне иногда нужно добавлять проверки, а иногда и удалять их, и такое ручное управление, безусловно, неверно.

+0

Возможный дубликат [Как я могу получить исключения, брошенные в будущее Scala?] (Http://stackoverflow.com/questions/6229778/how-do-i-get-hold-of-exceptions-rown- in-scala-future) –

+4

Это не дубликат. Я знаю, как получить исключение из Будущего. Мне нужен способ обработки ошибок, когда программист * забыл *, чтобы получить исключение из будущего - либо предотвратил их, либо ловить/лог при их возникновении. – danarmak

ответ

3

Я пришел к выводу, что нет никакого способа в целом заметить необработанные ошибки в фьючерсах Scala.

5

Вы можете просто использовать Future.recover в функции, которая возвращает будущее.

Так, например, вы могли бы просто «войти» ошибку и повторно выдать исходное исключение, в простейшем случае:

def libraryFunction(): Future[Int] = { 
    val f = ... 
    f.recover { 
     case NonFatal(t) => 
     println("Error : " + t) 
     throw t 
    } 
} 

Обратите внимание на использовании NonFatal, чтобы соответствовать всем типам исключений имеет смысл ловить ,
Этот восстановительный блок может в равной степени вернуть альтернативный результат, если хотите.

+0

Я надеялся найти способ обнаружить ошибки, даже если программист забыл проверить наличие ошибки. Похоже, такого варианта нет. – danarmak

+0

№ Любая «обработка» исключения в будущем, как правило, эквивалентна добавлению обработчика onComplete, и поэтому результаты или исключения не выделяются таким образом, чтобы вы могли определить, прилагается ли какая-либо обработка исключений. –

Смежные вопросы