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

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

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

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

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

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

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

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

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

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

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

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

  • HttpClientErrorException – Исключение, возникшее при получении HTTP 4xx.
  • HttpServerErrorException – Исключение, возникающее при получении HTTP 5xx.

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

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

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

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

Все эти исключения не отмечены.