Ответ 1
Если это не исключение в философии дизайна HttpClient, а исключение в вашем коде, тогда создайте свои собственные классы исключений. (В качестве подкласса org.apache.commons.httpclient.HttpException)
Я использую Apache HttpClient и хотел бы сообщить об ошибках HTTP (400 Bad Request, 404 Not Found, 500 Server Error и т.д..) через механизм исключения Java для вызывающего кода. Есть ли исключение в стандартной библиотеке Java или в широко используемой библиотеке, которая была бы подходящей для использования или для подкласса для этой цели?
Альтернативой является проверка кодов возврата статуса. Это, по-видимому, философия дизайна HttpClient, но поскольку эти ошибки действительно исключительны в моем приложении, я бы хотел иметь трассировку стека и другие прекрасные вещи, созданные для меня, когда они происходят.
Если это не исключение в философии дизайна HttpClient, а исключение в вашем коде, тогда создайте свои собственные классы исключений. (В качестве подкласса org.apache.commons.httpclient.HttpException)
Откроется страница Обработка исключений для HttpClient
Чтобы ответить на ваш вопрос, хотя существует класс org.apache.commons.httpclient.HttpException, который, вероятно, подходит.
Если для этого нужен специальный класс исключений, я бы подумал, что java.io.IOException будет правильным суперклассом для использования.
Я бы сказал, это зависит от того, для чего вы используете 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, либо предоставляя что-то полезное для пользователя, либо поиск форму или просто полезное сообщение об ошибке. В зависимости от вашего варианта использования вы можете просто показать контент ответа, а не исключать исключение.
Spring у вас есть именно то , что вы хотите:
Как минимум, вы должны отличать исключения, связанные с бизнес-логикой (например, недостаточный баланс, адрес электронной почты недействителен) от других исключений (например, сервер недоступен, неподдерживаемый тип носителя, SQLException).
В нашем REST API у нас есть библиотека для клиентов Java, которая анализирует ответы и выдает только три разных исключения:
MyBusinessException
, которое содержит сообщение, которое может быть показано конечному пользователю. Сообщение приходит в теле ответа (обработка исключений на стороне службы), но если его нет, у нас есть сообщение по умолчанию, специфичное для каждого кода состояния.HttpClientErrorException
с сообщением, характерным для каждого кода состояния.HttpClientErrorException
с общим сообщением.HttpServerErrorException
с общим сообщением.Все эти исключения не проверены.
org.apache.commons.httpclient.HttpException, если вы хотите исключение библиотеки. Мы также иногда создавали свои собственные для определенных целей, создавая исключение для определенных кодов состояния HTTP и общий для и неожиданный код состояния.
Я нашел это исключение на 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