2014-07-08 12 views
8

Say mam właściwość systemu MY_PROP:Prawy wyjątek rzucać za brak właściwości systemu

java -DMY_PROP="My value" 

Ta nieruchomość jest niezbędna dla mojego systemu do pracy.

Jaki jest właściwy wyjątek do rzucania, jeśli ta właściwość nie jest ustawiona?

@PostConstruct 
private void init() { 

    myProp = System.getProperty("MY_PROP"); 
    if (myProp == null) { 
     throw new ???? 
    } 
    // ... 
} 

Jakoś IllegalArgumentException nie czuje się dobrze. Może IllegalStateException, MissingResourceException, TypeNotPresentException? Jaka jest standardowa praktyka w tym scenariuszu?

+1

Dlaczego nie stworzysz własnego wyjątku? na przykład 'MissingSystemPropertyException'? –

Odpowiedz

12

Nie ma. Wrzuciłbym IllegalStateException, ponieważ brakuje tego parametru. Oznacza to, że weryfikator konfiguracji nie powiódł się, a aplikacja jest w nieprawidłowym stanie. Innymi słowy, nigdy nie powinieneś być w stanie zadzwonić na numer init().

Jeśli wartość parametru byłaby nieprawidłowa, to rzuciłbym IllegalArgumentException.

Jeśli piszesz weryfikator, powinieneś zdecydować pomiędzy użyciem RuntimeException lub zaznaczonym. Podczas używania na przykład javax.naming.ConfigurationException "lub utworzyć własny wyjątek konfiguracji. You API będzie w stanie obsłużyć taki wyjątek i właściwie zareagować w ramach spuścizny.

Definicje:

IllegalStateException - Sygnały, że metoda została przywołana w nielegalnym lub niewłaściwym czasie. Innymi słowy, środowisko Java lub aplikacja Java nie są w odpowiednim stanie dla żądanej operacji.

IllegalArgumentException - Generowany w celu wskazania, że ​​przyjęto metodę niezgodną z prawem lub niewłaściwą.

+2

Może powinienem napisać niestandardowy wyjątek 'MissingSystemPropertyException', który rozszerza' IllegalStateException'? –

+2

Nie ma absolutnie żadnego wstydu w tworzeniu podklasy IllegalStateException lub RuntimeException. Żałuję, że więcej bibliotek nie zrobiło tego zamiast rzucać ogólne wyjątki, takie jak IllegalState, Runtime, IllegalArgument itp. –

+0

@AdamGent, Masz rację. Lekko zredagowałem swoją odpowiedź. Sprawdzane wyjątki mają problem na poziomie projektu. Pomagają, ale i ograniczają. Zapomniałem o tym przez chwilę. Dzięki za przypomnienie. –

1

Ponieważ właściwość systemowa nie zawsze jest zdefiniowana, standardową praktyką jest użycie wartości domyślnej, gdy nie można znaleźć właściwości.

Właśnie sprawdziłem standardowy kod w java 7 (apache tomcat, java.lang, java.awt, ...), zawsze używają domyślnego "fallback", gdy właściwość to null.

Więc może twój problem jest gdzieś indziej?

Dlaczego nie bierzesz tych parametrów jako wymaganego argumentu swojego słoika? Następnie możesz użyć IllegalArgumentException.

+0

Dziękuję za wejście Magnus, ale mówię, że nie ma rozsądnej wartości domyślnej dla 'MY_PROP', naprawdę chcę rzucić wyjątek (lub błąd, ponieważ system nie będzie użyteczny bez tej właściwości). Jaki byłby najlepszy wyjątek do rzucania? –

+2

Myślę, że powinieneś napisać własny wyjątek. Ponieważ nie ma standardowego wyjątku dla tego (ponieważ nie jest to standardowa praktyka). – Magus

3

Dodaję tylko odpowiedź Vasha na Wiosenną Ramę. Jeśli używasz Spring Framework i chcesz być spójny z tym, jak większość komponentów na wiosnę to robi, to powinieneś powiedzieć, że powinieneś użyć IllegalStateException (lub własnego wyprowadzenia).

Wiosną większość komponentów, które wykonują @PostConstruct lub @Override void afterPropertiesSet() rzut IllegalStateException przy użyciu narzędzia org.springframework.util.Assert.state(..).

Można to zobaczyć w jednym z przykładów: Spring AMQP.

Powiedziałbym, że zgłosiłem błędy przeciwko Spring MVC where they used IllegalArgumentException zamiast niestandardowej i bardziej jednoznacznej pochodnej klasy. Dzięki statycznym klasom wbudowanym bardzo łatwo jest utworzyć niestandardowy wyjątek bez tworzenia innego pliku Java.

Powiązane problemy