Пример:
foobar = new InputStreamReader(p.getInputStream(), "ISO-8859-1");
Поскольку кодировка жестко запрограммирована и корректна, конструктор никогда не сгенерирует исключение UnsupportedEncodingException, объявленное в спецификации (если только реализация java не нарушена, в этом случае я все равно теряюсь). Во всяком случае, Java заставляет меня все равно иметь дело с этим исключением.
В настоящее время это выглядит так
try {
foobar = new InputStreamReader(p.getInputStream(), "ISO-8859-1");
}
catch(UnsupportedEncodingException e) { /* won't ever happen */ }
Есть идеи как сделать лучше?
java
exception-handling
user281377
источник
источник
Ответы:
Моя привычка состоит в том, чтобы просто быть в безопасности, чтобы положить
assert
в блок улова. Кто-то можетtry
позже изменить содержимое блока, и вы действительно хотите знать, если код не работает, не так ли?источник
assert false;
не добавляет слишком много беспорядка и дает понять, что я предполагаю, что блок catch никогда не будет введен.assert false : "should never happen"
.assert
подразумевает, что утверждения включены. Я выбрасываюUnexpectedException
(что также дает мне возможность отслеживать трассировку стека ...).Если бы мне давали цент за каждый раз, когда я видел журнал / ошибку «Это никогда не должно происходить», у меня было бы ... ну, два цента. Но до сих пор...
Пустые блоки захвата заставляют мои чувства паука покалывать, и большинство хороших инструментов анализа кода жалуются. Я хотел бы любой ценой оставить их пустыми. Конечно, теперь вы знаете, что ошибки никогда не произойдет, но через год кто-то делает глобальный поиск-замену «ISO-8859-1», и вдруг у вас может возникнуть чрезвычайно трудная для поиска ошибка.
assert false
Предложение хорошее, но так как утверждения могут быть отключены во время выполнения, они не являются гарантией. Я бы использовалRuntimeException
вместо этого. Их не нужно будет отлавливать при вызове классов, и если они когда-либо произойдут, у вас будет трассировка стека, дающая полную информацию.источник
Я всегда делал это так:
Может быть немного многословно (Java ...), но, по крайней мере, вы получите ошибку утверждения, когда произойдет невозможное.
Если реализация Java нарушена, вы захотите получить как можно более качественное сообщение об ошибке как можно быстрее, вместо того, чтобы просто игнорировать невозможное. И даже если реализация Java не нарушена, кто-то мог бы изменить ваш код на
"UTF8"
(упс, должно ли это быть"UTF-8"
?).Во -первых, это должно быть исключение времени выполнения. JDK полон такого неправильного выбора.
источник
foobar = new InputStreamReader(p.getInputStream(), Charset.ISO_8859_1);
- разве это не было бы лучше и не допустить ошибки раз и навсегда?Если вы являетесь единственным разработчиком, который когда-либо увидит этот код, то я бы сказал, что это нормально, но если нет, то я бы отнесся к нему как к реальной возможности или, по крайней мере, изменил бы комментарий «никогда не случится» на что-то более полезное.
источник
Больше всего меня раздражает то, что это вредит моему покрытию кода.
Когда я получу навязчивую информацию об освещении, я сверну попытку / улов, который "никогда не случится" (... или только если я использую мутантную JVM, которая почему-то забыла включить "US-ASCII") в класс и метод, который инкапсулирует этот try / catch и заменяет проверенное исключение одним из способов, упомянутых здесь (обычно выбрасывает непроверенное исключение с помощью сообщения об ошибке).
Тогда мое покрытие кода получает удар в служебном классе, но не во всех ссылках на эту операцию, разбросанных по моему коду.
Иногда я нахожу время, чтобы свернуть как операции в классе, который на самом деле имеет согласованную семантику. Но так как для моих товарищей по команде совершенно очевидно, что происходит, я обычно просто стараюсь делать это как можно проще и не беспокоиться о наилучшем возможном дизайне.
Однако, как упоминалось в комментарии, у Guava и других библиотек есть способы смягчить эту боль - но это в основном та же стратегия. Переместите раздражение за сцену, чтобы ваш основной код не принял удар по освещению.
источник