2009-08-03 1 views
3

Можно создать дубликат:
When to choose checked and unchecked exceptionsзарегистрированный или незарегистрированный Исключение

Здравствуйте!

Итак, я все еще чувствую себя комфортно, когда бросаю проверенное или неконтролируемое исключение. Я хотел бы знать, что думают другие является наиболее подходящим в данном случае:

class Correlation<T> 
{ 
    private final T object1, object2; 
    private final double correlationCoefficient; 

    public Correlation(T object1, T object2, double correlationCoefficient) 
    { 
     if(Math.abs(correlationCoefficient) > 1.0 || (object1.equals(object2) && correlationCoefficient != 1.0)) 
      throw new IllegalArgumentException(); 

     this.object1 = object1; 
     this.object2 = object2; 
     this.correlationCoefficient = correlationCoefficient; 
    } 
} 

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

Хорошо, дайте мне знать, что вы все думаете!

+2

Я бы направил вас на http://stackoverflow.com/questions/27578/when-to-choose-checked-and-unchecked-exceptions –

+0

Ваше использование исключения IllegalArgumentException (исключение во время выполнения) действительно, поскольку параметры являются незаконными (за ожидания конструктора (который должен быть документирован в JavaDocs)). –

ответ

4

На мой взгляд, ответ зависит от:

  • Ожидаете ли вы абонент, чтобы иметь возможность восстановить грациозно?
  • Является ли этот API предназначен для общественного или внутреннего потребления?

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

6

Я думаю, что это правильный ответ. Вы эффективно выполняете барьерные утверждения, то есть барьерные проверки, и если они ошибаются, вы отказываетесь создавать объект. Я бы документировал с помощью java-документа, что вы можете выбросить исключение IllegalArgumentException, но вне этого оно выглядит правильно.

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

Только мои 2 цента.


Редактировать

Просто чтобы быть ясно, здесь что-то вроде Java документа вы должны иметь:

/** 
* <Something describing constructor, and what it does, ending with a period.> 
* 
* @param parameter <Describe the parameter - do one for each parameter of the constructor, 
*  and note which values may be illegal for that particular parameter.> 
* @throws IllegalArgumentException <the case for the illegal argument exception.> 
2

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

if(Math.abs(correlationCoefficient) > 1.0) 
      throw new IllegalArgumentException("abs(correlationCoefficient) > 1.0 - " + correlationCoefficient); 
    if((object1.equals(object2) && correlationCoefficient != 1.0)) 
      throw new IllegalArgumentException("object1==object2, but correlationCoefficient != 1.0, " + correlationCoefficient); 

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

+0

Да, ВСЕГДА есть сообщение об исключении, которое объясняет исключение и содержит значения, которые привели к нему. –