Martwię się, że jest to wyjątek w czasie wykonywania, więc prawdopodobnie powinno być używane oszczędnie.
Standardowy przypadek użycia:
void setPercentage(int pct) {
if( pct < 0 || pct > 100) {
throw new IllegalArgumentException("bad percent");
}
}
Ale wydaje się, że wymusiłoby to następujący projekt:
public void computeScore() throws MyPackageException {
try {
setPercentage(userInputPercent);
}
catch(IllegalArgumentException exc){
throw new MyPackageException(exc);
}
}
Aby przywrócić go jako sprawdzony wyjątek.
Dobra, ale chodźmy z tym. Jeśli podasz złe dane wejściowe, pojawi się błąd wykonania. Po pierwsze, jest to dość trudna zasada do jednolitego wdrożenia, ponieważ może być konieczne wykonanie odwrotnej konwersji:
public void scanEmail(String emailStr, InputStream mime) {
try {
EmailAddress parsedAddress = EmailUtil.parse(emailStr);
}
catch(ParseException exc){
throw new IllegalArgumentException("bad email", exc);
}
}
Co gorsza - o ile 0 <= pct && pct <= 100
można oczekiwać statycznego sprawdzenia kodu klienta, nie dotyczy to bardziej zaawansowanych danych, takich jak adres e-mail, lub, co gorsza, czegoś, co należy sprawdzić w bazie danych, dlatego generalnie kod klienta nie może wstępnie uprawomocnić.
Zasadniczo mówię, że nie widzę sensownej, spójnej polityki dotyczącej używania IllegalArgumentException
. Wydaje się, że nie należy go używać i powinniśmy trzymać się własnych sprawdzonych wyjątków. Jaki jest dobry przypadek użycia, aby to wyrzucić?