2010-08-18 14 views
13

Ho una singola applicazione a thread che dovrebbe impostare il errorlevel del DOS su qualcosa di diverso da zero se c'è un problema. È meglio lanciare una RuntimeException o usare System.exit (diverso da zero)? Non ho bisogno della traccia dello stack e non mi aspetto che questa app venga estesa/riutilizzata. Quali sono le differenze tra queste due opzioni?System.exit (num) o lancia una RuntimeException dal principale?

+1

Sembra che tu abbia risposto alla tua stessa domanda. Se devi impostare un codice di errore DOS devi usare System.exit (codice). Non puoi farlo con un'eccezione. – EJP

+0

Consentire un RuntimeException dai set principali errorlevel a 3, anche se non sono sicuro del perché o se è in tutte le circostanze. – VarV

risposta

9

Non un'eccezione a meno che non hai davvero una condizione eccezionale. System.exit(int) esiste proprio per questo motivo. Usalo.

MODIFICA: Penso di aver erroneamente letto la tua domanda. Ho pensato che lo stavi chiedendo, quando vuoi uscire normalmente dalla JVM ma segnala che qualcosa non è andato bene, se è meglio lanciare un'eccezione o usare System.exit.

Tuttavia, se il problema che si verifica è qualcosa che è già indicato da un'eccezione Java, va bene a lasciare che tale eccezione non gestita andare. Non è necessario rilevare l'eccezione e chiamare System.exit.

Se è possibile scegliere se generare un'eccezione propria o chiamare System.exit, pensare se la condizione di errore è qualcosa che potrebbe essere gestita da qualche codice Java che chiama il metodo. Se l'errore si verifica direttamente nel metodo main, poi ci sarà probabilmente mai un chiamante di gestire l'eccezione in modo probabilmente si dovrebbe chiamare System.exit. Altrimenti, generalmente è meglio lanciare un'eccezione, ma non RuntimeException, probabilmente dovresti usare un tipo di eccezione che rappresenti in modo appropriato l'errore che hai incontrato. Scrivi la tua sottoclasse di RuntimeException se necessario.

+0

Allora perché le eccezioni lanciate dall'unità principale impostano il errorlevel? Sembra che siano lì per qualche motivo. – VarV

+2

Quando un'applicazione non viene completata correttamente, il suo codice di ritorno dovrebbe essere diverso da 0. Quindi la JVM imposterà automaticamente il codice di ritorno su 1 se c'è un'eccezione non gestita, in modo che il processo padre sappia che il programma è stato terminato a causa di un errore (e non solo perché ha finito di funzionare). –

-4

System.exit() non è raccomandato. Arresta JVM.

+0

La chiusura della JVM è OK in questo caso, l'applicazione viene eseguita in caso di errore. – VarV

+0

né RuntimeException generico è a mio avviso –

+0

o system.exit (int) o lanciare la nuova RuntimeException, non è quest'ultima considerata una RuntimeException generica? – VarV

6

In generale, in questa situazione, vorrei gestire tutte le eccezioni nel mio metodo principale, eventualmente chiamando System.exit. Questo ti dà la flessibilità su dove/se/come gestire condizioni eccezionali, pur soddisfacendo la tua necessità di terminare con un codice di errore. In particolare, ti dà il controllo sul codice di ritorno e su qualsiasi altro output che potresti generare per l'utente (messaggio di errore, traccia dello stack, ecc.). Se si lancia un'eccezione in main (o si lascia un'eccezione escape), si perde quel controllo.

In sintesi, chiamare System.exit solo nella tua top-level exception handler:

static public void main() { 
    try { 
     runMyApp(); 
    } catch (Exception e) { 
     System.exit(1); 
    } 
} 
+0

Probabilmente andrò con questa soluzione, ma stavo cercando i motivi per cui System.exit è preferito per lanciare un'eccezione dal main. – VarV

3

Un'eccezione lanciata stamperà l'analisi dello stack, e se non hai bisogno di questo, si shoul utilizzare System.exit .

All'uscita è possibile informare l'utente con un Sytem.out (presumo che l'app sia in esecuzione solo in un ambiente di comunicazione).

Si dovrebbe considerare di rilevare tutti gli errori solo registrando gli errori in un registro separato, questo assicura che lo stacktrace non venga perso per sempre quando si chiude il terminale. Date un'occhiata a log4j per questo scopo, è davvero facile da usare.

+0

Sì, è solo in un ambiente a riga di comando. Non ho bisogno dello stack trace perché è un passaggio automatico nel nostro processo di build che passa o fallisce, quindi anche log4j è eccessivo. – VarV

+0

Quindi vai per la soluzione system.exit. È una buona soluzione soprattutto se si verifica il codice di ritorno in seguito. In questo modo puoi segnalare cosa è andato storto usando codici diversi o semplicemente andare su System.exit (-1) – Jes

2

l'applicazione stessa deve utilizzare System.exit. È la sua interfaccia con l'ambiente di chiamata (script). Qualsiasi componente interno, naturalmente, dovrebbe utilizzare Eccezione. Quando si mettono insieme può essere entrambi of'em:

Application.main(...) { 
    parse(args); 
    check(...); 
    try { 
    MyObject o = ...; 
    o.doMyStuff(); 
    } catch (Exception e) { 
    System.err.println("Oops, something went wrong!"); // by example, or use a logging framework! // anyway in a shell app System.in/out/err IS my interface with the outworld 
    System.exit(ERROR_CODE); 
    } 
    System.out.println("Worked!"); 
} 
0

System.exit (num) non è una buona opzione, come il suo arresto JVM, più ancora che non ha ancora eseguito il blocco finally se avete dopo blocco di cattura.

Lancio RuntimeException potrebbe anche non essere il migliore dell'opzione, può sottoclasse come menzionato in precedenza che è un'eccezione app specifica potrebbe essere una soluzione migliore a mio parere. -Mese

Problemi correlati