Какова хорошая практика работы с некоторыми исключениями HTTP во время выполнения?
У меня есть небольшой метод, который выглядит так:
public static void unstarTrack(Context ctxContext, String strId) {
try {
HttpParams htpParameters = new BasicHttpParams();
List<NameValuePair> lstCredentials = new ArrayList<NameValuePair>();
lstCredentials.add(new BasicNameValuePair("t", String.valueOf(System.currentTimeMillis() / 1000)));
lstCredentials.add(new BasicNameValuePair("__call", "favourites.removeSong"));
HttpPost htpPost = new HttpPost(API_URL);
htpPost.setEntity(new UrlEncodedFormEntity(lstCredentials));
htpPost.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; rv:18.0) Gecko/20100101 Firefox/18.0");
htpPost.addHeader("Accept-Encoding", "gzip");
DefaultHttpClient dhcClient = new DefaultHttpClient(htpParameters);
HttpResponse resResponse = dhcClient.execute(htpPost);
Log.d(TAG, EntityUtils.toString(resResponse.getEntity()));
return;
} catch (SocketException e) {
throw new RuntimeException("problem with network connectivity.", e);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("Encoding not supported.", e);
} catch (ClientProtocolException e) {
throw new RuntimeException("A protocol exception was encountered.", e);
} catch (ParseException e) {
throw new RuntimeException("An error occurred while trying to read the header elements.", e);
} catch (IOException e) {
throw new RuntimeException("An error occurred while trying to read response stream.", e);
}
}
Сам метод довольно прост, но у него есть куча исключений, и я не знаю, как мне с ними справиться. Подавить их, выполнив простую функцию "e.printStackTrace()", не кажется хорошей идеей, поэтому я начал изучать рекомендации по обработке исключений, но все еще немного растерялся. Что мне делать с исключениями?
Мне нужно что-то сделать с моими исключениями, потому что я не хочу возвращаться null
из метода. Возвращение null
мой метод означает, что вызывающий метод не будет иметь представления о том, произошло ли исключение внутри моего метода.
Должен ли я создать собственное исключение и вызвать его или я должен просто вызвать непроверенные исключения?
Вызывающий метод не может реально повлиять на мой метод, т.е. SocketException
может возникнуть, если возникла проблема с подключением к сети, и IOException
может возникнуть, если возникла проблема с чтением потока. Максимум, что может сделать вызывающий метод - это повторить это позже.
Если я перезапущу все исключения, которые я перехватил, вызывающий метод будет просто пронизан блоками обработки исключений.
(Извините, если это кажется тривиальным вопросом. Я просто пытаюсь научиться писать лучший код. Спасибо.)
1 ответ
Создайте выделенное исключение, которое имеет соответствующий уровень абстракции (что-то вроде UnstarTrackException). Бросьте такое исключение, обернув оригинальное исключение, которое вы поймали. Таким образом, вызывающая сторона будет обрабатывать только одно исключение (я предполагаю, что все исключения должны обрабатываться одинаково: повторная попытка).
Должно ли быть проверено это исключение или нет, зависит от вашего вкуса. Если вы хотите, чтобы все методы вашего метода обрабатывали это исключение, сделайте его проверенным исключением. Если вы хотите, чтобы вызывающий абонент мог выбрать, будет ли он обрабатывать это исключение или нет, используйте исключение времени выполнения.
Если этот метод скрыт глубоко внутри слоев кода, и если исключение может быть обработано только на верхнем уровне, исключение времени выполнения, вероятно, является лучшим выбором. И на самом деле, если вы не единственный, кто вызывает этот метод, исключение времени выполнения также, вероятно, является лучшим выбором. Проверенные исключения обычно не используются в наши дни.