У меня есть однопоточное приложение, которое должно установить уровень ошибки DOS на ненулевое значение, если есть проблема. Лучше бросить RuntimeException или использовать System.exit (ненулевой)? Мне не нужна трассировка стека, и я не ожидаю, что это приложение будет расширено / повторно использовано. В чем различия между этими двумя параметрами?
Не бросайте исключение, если у вас действительно нет исключительных условий. System.exit(int)
существует именно по этой причине. Используйте его.
EDIT: Думаю, я неправильно понял ваш вопрос. Я думал, что вы спрашиваете, когда вы хотите выйти из JVM нормально, но сигнализируете, что что-то не совсем правильно, лучше ли бросить исключение или использовать System.exit
.
Однако, если возникшая проблема - это что-то, о чем уже сигнализирует исключение Java, то вполне можно просто оставить это исключение без обработки. Вам не нужно ловить исключение и вызывать System.exit
.
Если у вас есть выбор между собственным исключением или вызовом System.exit
, подумайте, является ли условие ошибки тем, что может быть обработано каким-либо Java-кодом, вызывающим ваш метод. Если ошибка возникает непосредственно в методе main
, то, скорее всего, никогда не найдется вызывающего пользователя, который бы обработал исключение, поэтому вам, вероятно, следует вызвать System.exit
. В противном случае, как правило, лучше бросить исключение - но не RuntimeException
, вам, вероятно, следует использовать тип исключения, который соответствующим образом представляет ошибку, с которой вы столкнулись. При необходимости напишите свой собственный подкласс RuntimeException
.
Сам APP должен использовать System.exit. Это его интерфейс с вызывающей средой (скриптом). Любой внутренний компонент, конечно, должен использовать Exception. Когда вы соберете их вместе, это может быть и то и другое:
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!");
}
Обычно в такой ситуации я бы обрабатывал все исключения в своем основном методе, возможно, вызывая System.exit
. Это дает вам гибкость в отношении того, где/где/как обрабатывать исключительные условия, и в то же время удовлетворяет вашей потребности в завершении с кодом ошибки. В частности, это дает вам контроль над кодом возврата и любым другим выводом, который вы можете сгенерировать для пользователя (сообщение об ошибке, трассировка стека и т.д.). Если вы выбросите исключение в main (или позволите исключению выйти), вы потеряете этот контроль.
Чтобы подвести итог, вызывайте System.exit
только в обработчике исключений верхнего уровня:
static public void main() {
try {
runMyApp();
} catch (Exception e) {
System.exit(1);
}
}
Выброшенное исключение распечатает трассировку стека, и если вам это не нужно, вы должны использовать System.exit.
После выхода вы можете проинформировать пользователя с помощью Sytem.out (я предполагаю, что приложение работает только в среде командной строки).
Вам следует подумать о том, чтобы просто вылавливать все ошибки и регистрировать ошибки в отдельном журнале, это гарантирует, что трассировка стека не будет потеряна навсегда при закрытии терминала. Взгляните на log4j для этой цели, он действительно прост в использовании.