Obawiam się, że jest to wyjątek środowiska wykonawczego, więc prawdopodobnie powinien być używany oszczędnie.
Standardowy przypadek użycia:Kiedy należy rzucić wyjątek IllegalArgumentException?
void setPercentage(int pct) {
if(pct < 0 || pct > 100) {
throw new IllegalArgumentException("bad percent");
}
}
Ale wydaje się, że byłoby wymusić następującą konstrukcję:
public void computeScore() throws MyPackageException {
try {
setPercentage(userInputPercent);
}
catch(IllegalArgumentException exc){
throw new MyPackageException(exc);
}
}
Aby dostać go z powrotem do bycia sprawdzone wyjątkiem.
OK, ale chodźmy z tym. Jeśli wprowadzisz złe dane wejściowe, pojawi się błąd runtime. Więc po pierwsze, że to rzeczywiście dość trudne polityka wdrożyć jednolity, ponieważ może trzeba zrobić bardzo przeciwny konwersję:
public void scanEmail(String emailStr, InputStream mime) {
try {
EmailAddress parsedAddress = EmailUtil.parse(emailStr);
}
catch(ParseException exc){
throw new IllegalArgumentException("bad email", exc);
}
}
a co gorsza - podczas sprawdzania 0 <= pct && pct <= 100
kodu klient powinien był zrobić statycznie, to nie jest tak w przypadku bardziej zaawansowanych danych, takich jak adres e-mail lub, co gorsza, coś, co należy sprawdzić w bazie danych, dlatego ogólnie kod klienta nie może wstępnie zatwierdzić.
W gruncie rzeczy mówię, że nie widzę sensownej, spójnej polityki w zakresie korzystania z IllegalArgumentException
. Wygląda na to, że nie powinno się go używać i powinniśmy trzymać się naszych sprawdzonych wyjątków. Co to jest dobry przypadek, aby to rzucić?
Myślę, że rada "gdzie oczekiwano, że zły argument jest błędem programisty" jest najbardziej spójna z tym, jak widziałem to używane, więc akceptując tę odpowiedź. – djechlin