Автоматизированное сообщение IllegalArgumentException? - PullRequest
6 голосов
/ 26 июля 2010

Я всегда проверяю аргументы открытых функций и выкидываю исключения, когда что-то не так. (Для частных помощников я использую утверждения).

Как это:

if( a < 0 || a >= b )
    throw new IllegalArgumentException("'a' must be greater or equal to 0 and 
        smaller than b ");

Но меня всегда раздражает написание этих сообщений об ошибках. Сообщение кажется мне излишним, так как это просто отрицание утверждения

a < 0 || a >= b

.

Также часто бывает, что я переименовываю переменную с помощью рефакторинга (в eclipse), и тогда сообщение не отражает изменения. Или я меняю условия и забываю менять сообщения.

Было бы здорово, если бы я мог написать что-то вроде:

assertArgument(a >= 0 && a < b);

Это должно вызвать исключение IllegalArgumentException с сообщением типа

"violated argument assertion: a >= 0 && a < b."

В C вы можете написать макрос (на самом деле в C assert это просто макрос). Есть ли простой способ сделать что-то подобное в Java?

Спасибо!

1 Ответ

3 голосов
/ 26 июля 2010

На языке C вы не можете использовать макросы для этого, но в cpp (препроцессоре C) вы можете :-) Если вы действительно хотите это сделать, ничто не ограничивает вас от запуска cpp на вашем java-источнике перед этим.компилируется.Это позволило бы вам использовать макросы в стиле cpp (вам может понадобиться убрать строки, начинающиеся с #line из вывода cp.)

Воспроизвести условное исключение, IMHO, включает слишком много деталей реализации.Если ваше сообщение об исключении описывает нарушение в контракте в терминах контракта (например, «родительский объект не указан», «сумма не может быть отрицательной»), вам не нужно менять его каждый раз, когда изменяется условие.

...