Какой класс исключений Java использовать для ошибок HTTP? - PullRequest
22 голосов
/ 17 октября 2008

Я использую Apache HttpClient и хотел бы сообщить об ошибках HTTP (400 Bad Request, 404 Not Found, 500 Server Error и т. Д.) Через механизм исключений Java вызывающему коду. Есть ли исключение в стандартной библиотеке Java или в широко используемой библиотеке, которая будет уместна для использования или для подкласса для этой цели?

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

Ответы [ 6 ]

11 голосов
/ 17 октября 2008

Если это не исключение в философии проектирования HttpClient, а исключение в вашем коде, то создайте свои собственные классы исключений. (Как подкласс org.apache.commons.httpclient.HttpException)

9 голосов
/ 17 октября 2008

Проверьте страницу на Обработка исключений для HttpClient

Чтобы ответить на ваш вопрос, хотя, кажется, существует класс org.apache.commons.httpclient.HttpException , который, вероятно, подходит.

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

4 голосов
/ 01 ноября 2017

Быстрый ответ

Весной у вас есть точно что вы хотите:

И рекомендуемая практика

Как минимум, следует отличать исключения, связанные с бизнес-логикой (например, недостаточный баланс, адрес электронной почты недействителен) от других исключений (например, сервер недоступен, неподдерживаемый тип носителя, SQLException).

В нашем REST API у нас есть библиотека для клиентов Java, которая анализирует ответы и выдает только три разных исключения:

  • 400, 401, 403, 404, 409, 422 : throw MyBusinessException, которое содержит сообщение, которое может быть показано конечному пользователю. Сообщение приходит в теле ответа (обработка исключений на стороне службы), но если его нет, у нас есть сообщение по умолчанию, специфичное для каждого кода состояния.
  • 405, 412, 415 : выбросить HttpClientErrorException с сообщением, характерным для каждого кода состояния.
  • другие коды 4xx : выбросить HttpClientErrorException с общим сообщением.
  • 5xx кодов : бросить HttpServerErrorException с общим сообщением.

Все эти исключения не проверены.

4 голосов
/ 17 октября 2008

Я бы сказал, что это зависит от того, для чего вы используете HTTPClient. Например, PayPal SDK использует HttpClient для передачи вызовов API на сервер PayPal, но не может проверить код ответа HTTP, когда это сделано. Я исправил свою копию так, что если код ответа не равен 200, он генерирует исключение PayPal FatalException с соответствующим сообщением. Это потому, что вызывающий абонент не интересуется HTML или какими-либо подробностями этого сообщения HTTP и даже не заинтересован в том факте, что мы используем HTTP в качестве транспорта. Если вызов успешен, тогда тело ответа содержит детали транзакции, которые извлекаются и помещаются в объект ответа; в противном случае он содержит HTML, который бесполезен. В данном случае HTTP - это всего лишь транспорт, поэтому определенные коды ответов указывают на ошибки, о которых можно сообщить, используя исключения. Поскольку это часть PayPal SDK, я использовал класс исключения PayPal. В какой-то другой системе или библиотеке я бы использовал подтип любых исключений, которые библиотека уже использует. Например, если бы я писал библиотеку GMail, которая обращается к учетным записям GMail, я, вероятно, создал бы класс GMailException и подкласс, который используется для различных типов исключений, с которыми сталкивается библиотека. Кроме того, вы можете использовать что-то вроде IOException .

Причина, по которой HttpClient заставляет вас проверять коды ответов, заключается в том, что ответ может быть полезен, даже если код ответа не равен 200. Некоторые веб-сайты размещают полезный текст на странице 404, либо предоставляя что-то полезное для пользователя, либо для поиска. Форма или просто полезное сообщение об ошибке. В зависимости от вашего варианта использования вы можете просто показать содержимое ответа, а не выдавать исключение.

2 голосов
/ 17 октября 2008

Существует org.apache.commons.httpclient.HttpException , если вы хотите исключение из библиотеки. Мы также иногда создавали свои собственные для определенных целей, создавая исключение для определенных кодов состояния HTTP, а также общее для неожиданного кода состояния.

0 голосов
/ 27 января 2019

Я обнаружил это исключение в Apache HTTP Client 4.5.7:

...
import org.apache.http.client.HttpResponseException;

...
StatusLine statusLine = response.getStatusLine();
if(statusLine.getStatusCode() != 200) {
    throw new HttpResponseException(statusLine.getStatusCode(), statusLine.getReasonPhrase());
}
...

Образец результата:

Exception in thread "main" org.apache.http.client.HttpResponseException: status code: 400, reason phrase: Bad Request
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...