Скажите, что у меня есть следующая строка в методе:
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!");
}
}
Или есть ли более изящный способ обработать исключения, которые никогда не могут действительно происходить?
Никогда не говори никогда;)
В примере выше вы всегда можете поймать исключение, а затем выбросить 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
Если вы можете практически гарантировать, что исключение никогда не произойдет , то лучше локализовать это утверждение в самой узкой области, чем позволять ему распространяться , потому что другие люди могут не понять, что это так, не глядя на документацию.
Если объявлен метод для выдачи чего-либо, тогда должны быть сценарии, в которых это действительно происходит. Если почти гарантировано, что этого никогда не произойдет, то лучше вообще опустить предложение throws
и упростить ваш API .
Вы всегда должны создавать исключения, соответствующие вашему уровню абстракции ( Эффективное второе издание Java , элемент 61). Заявление о том, что вы можете что-то бросить, когда этого никогда не произойдет, нарушает это руководство по дизайну.