2015-07-02 4 views
7

Worin besteht der Unterschied zwischen der Rückgabe von Future.failed(new Exception("message!")) und throw new Exception("message!") in Scala?Unterschied zwischen der Rückgabe von Future.failed (Ausnahme) und dem Auslösen einer Ausnahme

Lassen Sie uns sagen, dass dies in einer Funktion geschieht, die Future[Unit] zurückzukehren, und die anrufende Funktion ist wie folgt:

someFunction onFailure { 
    case ex: Exception => log("Some exception was thrown") 
} 

Gibt es eine Präferenz des einen über den anderen oder einen bestimmten Anwendungsfall für jeden?

Antwort

8

Der Aufruf Future { throw ex } und Future.failed(ex) erzeugt ein äquivalentes Ergebnis. Die Verwendung von Future.failed ist jedoch effizienter. Wenn wir von Future.apply an diesem Schnipsel sehen (von here in the source):

promise complete { 
    try Success(body) catch { case NonFatal(e) => Failure(e) } 
} 

Wir bemerken, dass (wie zu erwarten war), das auf einem try...catch Block beruht. Von diesen ist bekannt, dass sie im Vergleich zu normalem Code einen hohen Overhead aufweisen. Die Methode Future.failed ist im Wesentlichen eine Abkürzung, ohne die Kosten dafür zu tragen, dass die Ausnahme tatsächlich ausgelöst wird.

+4

Tatsächlich stammt der meiste Overhead in der Ausnahmebehandlung von der Instanziierung der Ausnahmen (weil sie - standardmäßig - den Stapel erfassen, der ziemlich teuer ist). Da Sie die Ausnahme entweder instanziieren (ob Sie "Future.failed" oder "Future {throw ex}" verwenden), tritt dieser Teil nicht in die Gleichung ein. Das lässt nur den tatsächlichen Wurf-/Fangmechanismus in Betracht ziehen. Es hat sicherlich einen Preis, aber es wird von den Kosten für die Erstellung der Ausnahme an erster Stelle dominiert, so dass die Verwendung beider Stile in der Praxis nicht so viel ausmachen wird. –

+0

Um Ihnen eine Idee zu geben, habe ich einen (völlig unwissenschaftlichen) Benchmark erstellt, um die Ausführungszeit des Falles "Neue Ausnahme + Wurf + Fang" mit dem Fall "Neue Ausnahme" zu vergleichen, und der Unterschied betrug weniger als 1% auf meinem Rechner . –

+1

Fair genug. Ich frage mich, ob andere Faktoren wie die Speichernutzung auch einen Unterschied ausmachen. Unabhängig davon würde ich sagen, dass die "gescheiterte" Methode sauberer und idiomatischer ist. –

Verwandte Themen