Wpis z mikrobloga

@toord: nie ma dobrej odpowiedzi. Wyjątki rzucasz tam gdzie uważasz to za stosowne a łapiesz tam gdzie chcesz je obsłużyć. Ta metoda może być wywołana w różnych kontekstach: np. ktoś będzie chciał przerwać dalszy procesing a ktoś tylko zalogować, że album już istnieje wobec tego rzucenie wyjątku i obsługa "gdzieś wyżej" ma sens
@toord: Wszystko zależy od konkretnego przypadku. W twoim jest ok, metoda ma utworzyć nowy album jeśli nie ma takiego o wskazanej nazwie i go zwrócić. Wyjątek jest tutaj naturalnym sposobem poinformowania o niepowodzeniu. Try-catch używasz na tym poziomie, na którym coś z tym wyjątkiem możesz zrobić (np. wyświetlić komunikat użytkownikowi).
@toord: Zastanow sie tylko czy nie lepiej uzyc jakiegos generycznego wyjatku typu EntityExistsException lub EntityAlreadyExistsException w Twoim projekcie. Moze przyjmowac encje jako argument w celu getMessage(). Pewnie skonczy sie, ze ten wyjatek AlbumExistsException zostanie uzyty w tym jedynym case, czyli podczas dodawania. Ewentualnie nazwij go AlbumAlreadyExistsException.
@toord: Na poziomie modelu rzucaj wyjątkami. Model ma być „twardy” – nie pozwalać na nieprawidłowe wartości. Jak korzystasz z modelu to „wiesz co robisz”.

Natomiast warstwa wyżej, jakiś sklejacz do UI: albo powinien zwalidować dane przed odpaleniem modelu, albo właśnie te wyjątki z modelu przechwytywać, żeby opakować je jakoś ładnie dla użyszkodnika.
@toord: wyjątki są "ciężkie". Długo się je rzuca, ale JVM nieźle potrafi to optymalizować. Posłuchaj sobie https://www.youtube.com/watch?v=fjv_rb0hY-Q

Tak, bezpiecznie jest rzucać i gdzie nie daleko łapać wyjątki, ale jak Ci mega zależy na wydajności to lepiej nie dopuszczać do wyjątkowych sytuacji, zawczasu walidując wszystko, co się da. Sterowanie aplikacją przez wyjątki, skakanie po niej także jest koszmarem.