Подтвердить что ты не робот

Какой класс исключения Java используется для ошибок HTTP?

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

Spring у вас есть именно то , что вы хотите:

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

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

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

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

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

Ответ 5

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

Ответ 6

Я нашел это исключение на 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