2014-07-08 7 views
8

Dire che ho una proprietà di sistema MY_PROP:eccezione Diritto di gettare per la mancanza di una proprietà di sistema

java -DMY_PROP="My value" 

Questa proprietà è necessario per il mio sistema di lavorare.

Qual è l'eccezione giusta da lanciare se questa proprietà non è impostata?

@PostConstruct 
private void init() { 

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

In qualche modo IllegalArgumentException non sembra giusto. Forse IllegalStateException, MissingResourceException, TypeNotPresentException? Qual è la pratica standard per questo scenario?

+1

Perché non si crea la propria eccezione? per esempio. 'MissingSystemPropertyException'? –

risposta

12

Non c'è nessuno. Vorrei buttare il IllegalStateException, perché manca il parametro. Ciò significa che il validatore di configurazione non è riuscito e la tua applicazione è in uno stato non valido. In altre parole non si dovrebbe mai essere in grado di chiamare il init() affatto.

Nel caso in cui il valore del parametro non sia valido, quindi vorrei lanciare un IllegalArgumentException.

Se si sta scrivendo un validatore, è necessario decidere tra l'utilizzo di RuntimeException o quello selezionato. Quando si utilizza, ad esempio, javax.naming.ConfigurationException` o creato una propria eccezione di configurazione. L'API sarà in grado di gestire tale eccezione e reagire correttamente in termini di eredità.

Definizioni:

IllegalStateException - I segnali che un metodo è stato invocato in un momento illegale o inappropriato. In altre parole, l'ambiente Java o l'applicazione Java non sono nello stato appropriato per l'operazione richiesta.

IllegalArgumentException - Generato per indicare che un metodo è stato superato un argomento illegale o inappropriato.

+2

Forse dovrei scrivere una custom 'MissingSystemPropertyException' che estenda' IllegalStateException'? –

+2

Non c'è alcun imbarazzo nella creazione di sottoclassi di IllegalStateException o RuntimeException. Vorrei che più librerie lo facessero invece di lanciare eccezioni generiche come IllegalState, Runtime, IllegalArgument ecc. –

+0

@AdamGent, Hai ragione. Ho leggermente modificato la mia risposta. Le eccezioni controllate presentano un problema a livello di progettazione. Aiutano ma anche i limiti. Ho dimenticato questo per un momento. Grazie per ricordare. –

1

Poiché una proprietà di sistema non è sempre definita, la procedura standard consiste nell'utilizzare un valore predefinito quando non è possibile trovare la proprietà.

Ho appena controllato un codice standard in java 7 (apache tomcat, java.lang, java.awt, ...), usano sempre un "fallback" predefinito quando la proprietà è null.

Quindi forse il tuo problema è da qualche altra parte?

Perché non prendi questi parametri come argomento obbligatorio del tuo jar? Quindi è possibile utilizzare IllegalArgumentException.

+0

Grazie per l'input Magnus, ma diciamo che non esiste un valore sensato predefinito per 'MY_PROP', voglio davvero lanciare un'eccezione (o un errore dato che il sistema non sarà utilizzabile senza questa proprietà). Quale sarebbe la migliore eccezione da lanciare? –

+2

Penso che dovresti scrivere la tua eccezione. Perché non c'è un'eccezione standard per questo (perché non è una pratica standard). – Magus

3

Aggiungo solo alla risposta di Vash per il Framework di primavera. Se usi il framework Spring e vuoi essere coerente con la maggior parte dei componenti in Spring, allora dovrei dire che dovresti usare IllegalStateException (o la tua derivazione).

In primavera la maggior parte dei componenti che esegue un @PostConstruct o @Override void afterPropertiesSet() utilizza org.springframework.util.Assert.state(..)IllegalStateException.

Si può vedere ciò fatto in Spring AMQP come un esempio.

Detto questo, in realtà ho archiviato bug contro Spring MVC where they used IllegalArgumentException invece di una classe derivata personalizzata e più esplicita. Con le classi statiche inline è molto facile creare un'eccezione personalizzata senza creare un altro file Java.

Problemi correlati