Это нормально, чтобы попробовать / поймать что-то просто проверить, если исключение было брошено или нет?


это хороший способ попробовать что-то бесполезно, просто чтобы увидеть, если конкретное исключение на этот код ?
Я хочу сделать что-то, когда исключение выбрасывается, и ничего другого.

try {  
    new BigDecimal("some string"); // This do nothing because the instance is ignored  
} catch (NumberFormatException e) {  
    return false; // OK, the string wasn't a well-formed decimal  
}  
return true;

слишком много предварительных условий для тестирования, и конструктор BigDecimal() всегда проверяет их все, поэтому это кажется самым простым методом.

10 51

10 ответов:

как правило, этой практики следует избегать. Но так как нет никакого полезного метода isValidBigDecimal(..), вот так и надо идти.

как отметил Питер Тиллеманс в комментариях, поместите этот код в метод утилиты под названием isValidBigDecimal(..). Таким образом, ваш код будет агностиком способа определения валидности, и вы можете даже позже переключиться на другой метод.

Борис Павлович предложил вариант проверить это, используя стороннюю библиотеку (commons-lang). Есть еще один полезный способ там, который я использую всякий раз, когда мне нужно проверить номера - NumberUtils.isNumber(..)

Если вам не нравится иметь такой метод, попробуйте использовать BigDecimalValidator С Apache Commons Validator. В случае неверного ввода String возвращает null.

производительность может быть не большой и синтаксис подробный, но код очень точен о том, что он делает. Нет никакого дублирования между проверкой и использованием, что всегда вызывает большую озабоченность.

(обратите внимание, что этот конкретный вид преобразования в и из строк действительно предназначен для отладки и внутренней конфигурации. Он не обрабатывает локали и другие ориентированные на человека соображения. Использование в форматах файлов и проводных протоколах вводит сильную зависимость к представлению, используемому класс.)

есть два известных способа "проверить" предварительные условия.

LBYL: посмотрите, прежде чем прыгать

этот стиль кодирования явно проверяет предварительные условия Перед выполнением вызовов или поисков. Этот стиль контрастирует с подходом EAFP и характеризуется наличием многих утверждений if.

EAFP : легче просить прощения, чем разрешения.

этот общий стиль кодирования предполагает наличие допустимых ключей или атрибутов и ловушек исключения, если предположение окажется ложным. Этот чистый и быстрый стиль характеризуется наличием многих попыток и кроме заявлений. Техника контрастирует со стилем LBYL, общим для многих других языков, таких как C.

EAFP всегда хорошая идея для языка, который имеет утку набрав.

Это явно зависит от того, что вы хотите сделать... Если вы не уверены в типе объекта для манипулирования, используйте EAFP.

Да, это, безусловно, противоречит понятию прагматического программиста "исключения для исключительных случаев", но вы признаете, что делаете, поэтому нет проблем IMO

комментарий к ответу Крисса: Я не вижу здесь "превосходную утечку памяти". Там нет ссылки на созданный BigDecimal. Как только этот метод завершается, и мы выходим за рамки, объект имеет право на сбор мусора.

утечки памяти происходят, когда мы держим ссылки, которые нам больше не нужны, поэтому объект не может быть собран в мусор.

блоки Try / Catch никогда не должны использоваться для логики.

вы должны учитывать, что строительство объекта исключения стоит дорого С точки зрения времени и ресурсов для JVM, потому что он должен построить трассировку strack.

Итак, то, что вы предлагаете, является простым, но ресурсоемким способом решения проблемы.

итак, является ли это решение приемлемым или нет, зависит от использования, которое вы собираетесь дать этой функции, и ваших требований к эффективности.

конечно, почему бы и нет. Это то, что мы делаем, чтобы проверить, правильно ли отформатирован адрес электронной почты, указанный клиентом:

try
{
    MailMessage m = new MailMessage(from, to, subject, body);
    return true;
}
catch(SmtpFailedRecipientsException ex)
{
    return false;
}
  • выше код будет ловушка точные форматы данных, принятые. NET. любой, кто проанализировал адреса электронной почты будет знать, что есть много различий о том, что считается правильно отформатированный адрес электронной почты адресная структура. Этот код гарантирует проверку структур адресов электронной почты так, как нравится .NET, а не так, как я думаю, что это должно быть.
  • исключение захватывает несколько вариантов использования, а не только правильность базовой структуры данных. Он будет проверять нескольких пользователей в полях CC, BCC и TO, что начинает становиться громоздким для рукописного кода.

как другие обсуждают выше, этот код лучше абстрагировать в отдельный служебный класс, а не смешивать в вашем основном коде.