2015-07-02 9 views
7

W programie Scala jaka jest różnica między zwrocie Future.failed(new Exception("message!")) i throw new Exception("message!")?Różnica między zwrotem Future.failed (wyjątek) a wyrzuceniem wyjątku

Powiedzmy, że to się dzieje w funkcji, która jest powrót Future[Unit], a funkcja powołanie jest tak:

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

Czy istnieje preferencja jednego nad drugim lub konkretnego przypadku użycia dla każdego?

Odpowiedz

8

Wywołanie Future { throw ex } i Future.failed(ex) spowoduje utworzenie równoważnego wyniku. Jednak korzystanie z Future.failed jest bardziej wydajne. Jeśli spojrzymy na ten urywek z Future.apply (od here in the source):

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

Zauważamy, że (jak można się spodziewać), to opiera się na try...catch bloku. Wiadomo, że przenoszą one duże obciążenie w porównaniu do normalnego kodu. Metoda Future.failed jest w istocie skrótem do tego bez konieczności ponoszenia kosztów faktycznego wyrzucenia wyjątku.

+4

Właściwie większość narzutów w obsłudze wyjątków pochodzi z instancji wyjątków (ponieważ domyślnie - przechwytują stos, który jest dość drogi). Ponieważ zamierzasz utworzyć wyjątek w dowolny sposób (niezależnie od tego, czy używasz 'Future.failed' czy' Future {throw ex} '), ta część nie wchodzi w równanie. Co tylko pozostawia rzeczywisty mechanizm rzutu/catch do rozważenia. To na pewno ma koszt, ale jest zdominowany przez koszt stworzenia wyjątku, więc użycie dowolnego stylu nie będzie miało większego znaczenia w praktyce. –

+0

Aby dać ci pomysł, wykonałem (całkowicie nienaukową) analizę porównawczą, aby porównać czas wykonania "nowego wyjątku + rzutu + połowu" z przypadkiem "nowego wyjątku", a różnica była mniejsza niż 1% na moim komputerze . –

+1

Wystarczająco fair. Zastanawiam się, czy inne czynniki, takie jak wykorzystanie pamięci, również wykazują różnicę. Niezależnie od tego, powiedziałbym, że metoda "nieudana" jest czystsza i bardziej idiomatyczna. –