Подтвердить что ты не робот

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

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

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() всегда проверяет их все, поэтому это кажется самым простым методом.

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

Нет ничего плохого в этом; в конце концов, сторонники какого-то другого языка любят говорить "легче извиниться, чем просить разрешения", то есть легче подождать, чтобы что-то потерпело неудачу и справилось с ним, чем вообще избежать неудачи. В этом случае, так как нет альтернативы, абсолютно пойти на это.

Ответ 4

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

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

Ответ 5

Существует два известных метода "проверки" предусловий.

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

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

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

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

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

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

Ответ 6

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

Ответ 7

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

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

Ответ 8

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

Ответ 9

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

try
{
    MailMessage m = new MailMessage(from, to, subject, body);
    return true;
}
catch(SmtpFailedRecipientsException ex)
{
    return false;
}

Теперь люди могут спорить о производительности или уместности структуры, но они просто забывают компромиссы:

  • Выше кода будет ловить файлы EXACT, принятые .NET. Любой, кто разобрал адреса электронной почты, будет знать, что существует большая разница в том, что считается правильно отформатированной структурой адресов электронной почты. Этот код гарантирует проверку структур адресов электронной почты так, как это нравится .NET, а не так, как мне кажется.
  • Исключение прерывает несколько вариантов использования, а не только правильность базовой структуры данных. Он будет проверять несколько пользователей в полях CC, BCC и TO, которые начинают неудобно делать с рукописным кодом.

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

Ответ 10

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

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

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