контроль, если исключения поглощаются статическим логическим значением - PullRequest
1 голос
/ 19 марта 2010

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

try {
    apiCall();
} catch (Exception e) {
    if(!SWALLOW_EXCEPTION) {
        throw e;
    }
}

Это потрясающая идея или ее можно сделать лучше?

Ответы [ 4 ]

6 голосов
/ 19 марта 2010

Я бы порекомендовал использовать Logger, например SLF4J , java.util.logging или Log4j .Любые сообщения журнала, которые являются «отладочными», но которые вы все еще хотите отслеживать, вы можете поместить на уровни DEBUG, INFO или WARN в зависимости от их серьезности.Реальные ошибки можно сохранить для уровня «Ошибка».

Когда вы делаете демонстрации для клиентов, установите уровень журнала на «Ошибка», чтобы они не видели все.Тем не менее, когда вы работаете в обычном режиме, установите его на уровень, чтобы получить необходимый уровень ведения журнала.

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

2 голосов
/ 19 марта 2010

Это не красиво. Как насчет реализации обработчика ошибок верхнего уровня (что бы это ни значило в вашем контексте), который это делает?

0 голосов
/ 19 марта 2010

Вместо этого вы можете использовать «необработанный обработчик исключений». Проверьте код в http://stuffthathappens.com/blog/2007/10/07/programmers-notebook-uncaught-exception-handlers/ и http://www.javapractices.com/topic/TopicAction.do?Id=229. Вы также можете написать свой обработчик, чтобы поместить исключения в регистратор.

0 голосов
/ 19 марта 2010

Вы намеревались сделать это для своего кода?

   try {
      apiCall();
    } catch (Exception e) {
      if(!SWALLOW_EXCEPTION) {
         throw e;
      } else {
         e.printStackTrace();
      } 
    }

Если это так, то если это единственное место, где вызывается этот API, мне кажется, это нормально, если вы понимаете, что вам нужно будет перекомпилировать изменения, чтобы изменения вступили в силу. Вы можете использовать фреймворк для ведения журналов, чтобы сделать это без перекомпиляции, например так:

  if (logger.isInfoEnabled()) {
       throw e;
  } else {
       logger.error(e.getMessage(), e);
  }

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

 if (Boolean.getBoolean("development")) {
       throw e;
 } else {
       e.printStackTrace();//you should really use a logging framework anyway and not this.
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...