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?
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. –
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 . –
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. –