Подавить-поймать или выбросить исключения, которые никогда не могут возникнуть? - PullRequest
6 голосов
/ 10 марта 2010

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

 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!");
   }

}

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

Ответы [ 2 ]

18 голосов
/ 10 марта 2010

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

В приведенном выше примере вы всегда можете перехватить исключение и затем создать исключение 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% никогда не случится, но в сумасшедшем случае, когда это случится, вы все равно получите пузырек исключения до такой степени, что вы, надеюсь, заметите это и будете возможность быстро понять, что изменилось, и исправить это.

НТН

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...