2017-12-01 4 views
0

Ich versuche zu verstehen, wie Futures mit Ausnahmen kombiniert werden können. Die Funktion FutureA gibt entweder eine Zukunft zurück oder löst eine Ausnahme aus. Wenn ich versuche, die Ausnahme zu fangen, passiert nichts. Warum das?Kombinieren von Futures und Ausnahmen

package test 

import scala.concurrent._ 
import scala.concurrent.ExecutionContext.Implicits.global 


object TestFutures extends App { 

    def futureA(x: Int) = Future { 
    if (x==1) 
     1 
    else 
     throw new Exception("there's an error") 
    } 

    try { 
     futureA(2) 
    } 
    catch { 
    case ex:Exception => println("an exception was thrown")  

    } 

    println("end") 
    Thread.sleep(15000) 
} 
+0

Um genau zu sein, ist Ihre Beschreibung der Funktion futureâ ungenau. Die Funktion gibt eine Zukunft zurück, und diese Zukunft stellt entweder einen Wert oder eine Ausnahme dar. Eine Ausnahme, die im Körper der Zukunft ausgelöst wird, wird vom Aufrufer nicht gesehen, da dieser Code möglicherweise nicht einmal ausgeführt wurde, wenn FutureA zurückkehrt. –

+0

ist das nicht der Grund, warum Sie 'recover' verwenden müssen, um die Ausnahme zu fangen? – ps0604

+0

Nochmals sehr vorsichtig mit dem Wortlaut: 'recover' fängt die Ausnahme nicht ab,' Future.apply' fängt die Ausnahme ab. 'recover' sagt, welcher Wert der Future sein wird, wenn eine passende Ausnahme von' Future.apply' abgefangen wird. –

Antwort

1

Dies ist, wie Sie Ausnahmen abfangen, die durch Funktionen ausgelöst werden können, die Futures zurück:

package test 

import scala.concurrent._ 
import scala.concurrent.ExecutionContext.Implicits.global 


object TestFutures extends App { 

    def futureA(x: Int) = Future { 
    if (x==1) 
     1 
    else 
     throw new Exception("there's an error") 
    } 

    futureA(2).map { result => 
     println("OK") 
    } 
    .recover{ 
     case ex:Exception => println("an exception was thrown")  
    } 

    println("end") 
    Thread.sleep(15000) 
} 
Verwandte Themen