Как хороший консультант, я говорю «это зависит».
В общем, на Java у вас есть четкое представление о том, какие могут быть все возможные исключения в определенной точке кода. Нередко можно увидеть, что кто-то использует
} catch (Exception e){
// log or stack trace
}
... в более или менее отдаленном коде. В общем, однако, вы не должны поймать исключение, которое вы не знаете, как обращаться с полезным. (Никогда, никогда никогда, не делать catch (Exception x) ;
, то есть, просто выбросить исключение. Никогда.)
Контролирующий вещь, чтобы спросить: «Что я могу сделать с этим?» Часто исключение из файла без вывода можно обработать, попросив пользователя, где его файл исчез. Исключение в zip-файле сложнее. Таким образом, вы можете захотеть иметь отдельное поведение.
С другой стороны, если это программа командной строки, в любом случае может потребоваться не более чем сообщение об ошибке.
Еще один совет; не выводить трассировку стека в код кода с «cutomer», который может видеть не-программист. Непрограммисты, как правило, смотрят на дополнения стека и паники. Лучше перевести исключение на сообщение типа «File» filename «not found». и, если вам действительно нужна трассировка стека, ose logging, чтобы отправить его на вывод уровня отладки.
Re: непоследовательное состояние, я считаю, что, наконец, блоки всегда выполняются на Java, поскольку исключение вылетает из стека, независимо от того, было ли исключено исключение. Поэтому, даже если вы стараетесь не улавливать «фатальные» исключения, чтобы избежать выполнения, когда вы находитесь в противоречивом состоянии, у вас нет возможности остановить выполнение ваших блоков finally.Таким образом, ИМО это спорный вопрос в JRE, если вы не избегаете использования блоков finally, которые кажутся ужасными, когда приходится сдаваться. .NET CLR отличается - у вас есть возможность прервать BEFORE, наконец, будут выполняться блоки, если есть необработанное исключение. –