Подавлять-выгода или выдает исключения, который никогда не может происходить?

Скажите, что у меня есть следующая строка в методе:

 String encodedString = URLEncoder.encode(foo, "utf-8");

этот метод бросает UnsupportedEncodingException. Который лучше:

/** @throws UnsupportedEncodingException umm...never
 */
public void myMethod() throws UnsupportedEncodingException {
   ...
   String encodedString = URLEncoder.encode(foo, "utf-8");
   ...
}

(то, чтобы вынуждать вызывающую сторону поймать это саму) Или:

public void myMethod() {
   try {
     ...
     String encodedString = URLEncoder.encode(foo, "utf-8");
     ...
   catch(UnsupportedEncodingException e) {
      Logger.log("cosmic ray detected!");
   }

}

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

6
задан Epaga 10 March 2010 в 09:38
поделиться

2 ответа

Никогда не говори никогда;)

В примере выше вы всегда можете поймать исключение, а затем выбросить RuntimeException:

public void myMethod() {
   try {
      ...
      String encodedString = URLEncoder.encode(foo, "utf-8");
       ...
   } catch(UnsupportedEncodingException e) {
     throw new RuntimeException("This should not be possible",e);
   }

}

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

HTH

18
ответ дан 8 December 2019 в 04:52
поделиться

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

Если объявлен метод для выдачи чего-либо, тогда должны быть сценарии, в которых это действительно происходит. Если почти гарантировано, что этого никогда не произойдет, то лучше вообще опустить предложение throws и упростить ваш API .

Вы всегда должны создавать исключения, соответствующие вашему уровню абстракции ( Эффективное второе издание Java , элемент 61). Заявление о том, что вы можете что-то бросить, когда этого никогда не произойдет, нарушает это руководство по дизайну.

6
ответ дан 8 December 2019 в 04:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: