Jeśli masz błędy biblioteki wewnętrznych (niespodziewane), niech wyjątki środowiska wykonawczego propagować. Jeśli w kodzie biblioteki wystąpi błąd, oczekuje się, że klient ulegnie awarii. Napraw błąd w bibliotece. Nie przechwytuj wszystkich i zwróć wyjątek specyficzny dla biblioteki, to nie przyniesie nic dobrego.
Jeśli oczekujesz rzeczy do (czasami) nie udać, zbudować to do API. Jest to oparte na zasadzie, że nie powinieneś używać wyjątków dla normalnego przebiegu programu.
Na przykład:
ProcessResult performLibraryTask(TaskSpecification ts)
W ten sposób można mieć ProcessResult wskazują warunki błędach:
ProcessResult result = performLibraryTask(new FindSmurfsTaskSpecification(SmurfColor.BLUE));
if (result.failed()) {
throw new RuntimeException(result.error());
}
Takie podejście jest podobne do zwróci null podejścia, ale można wysłać więcej informacji z powrotem do klient.
EDIT:
interakcji, które nie są zgodne z ustalonym protokołem, można rzucić błędy wykonawcze, które można udokumentować. Na przykład:
if (currentPeriod().equals(SmurfColor.BLUE) && SmurfColor.GREEN.equals(taskSpecification.getSmurfColor()) {
throw new IllegalStateException("Cannot search for green smurfs during blue period, invalid request");
}
Należy pamiętać, że jest to spowodowane interakcją, która naruszyła umowę i nie należy się spodziewać.
Czy znasz wzór obiektu zerowego? http://pl.wikipedia.org/wiki/Null_Object_pattern –