Я пишу API, который подключается к сервису, который либо возвращает простое сообщение «Успех», либо один из более чем 100 различных типов ошибок.
Первоначально я подумал написать метод, который отправляет запрос в эту службу, чтобы в случае успеха метод ничего не возвращал, но если произошел сбой по какой-либо причине, он выдает исключение.
Я не возражал против этого дизайна, но с другой стороны, только сегодня я читал книгу Джошуа Блоха " Как разработать хороший API и почему это важно ", где он говорит "Бросьте исключения" чтобы указать исключительные условия ... Не заставляйте клиента использовать исключения для потока управления. " (и «И наоборот, не подводите молча.»)
С другой стороны, я заметил, что используемый мной HttpWebRequest, по-видимому, генерирует исключение при сбое запроса, а не возвращает ответ, содержащий сообщение «500 Internal Server Error».
Каков наилучший способ сообщения об ошибках в этом случае? Если я выброшу исключение при каждом неудавшемся запросе, буду ли я в будущем испытывать сильную боль?
Редактировать: Спасибо, очень любезно за ответы до сих пор. Некоторая разработка:
- это DLL, которая будет предоставлена клиентам для ссылки в их приложении.
- аналогичным примером использования будет
ChargeCreditCard(CreditCardInfo i)
- очевидно, что когда метод ChargeCreditCard () не работает, это огромная сделка; Я просто не уверен на 100%, стоит ли мне останавливать прессы или передать эту ответственность клиенту.
Редактировать второе:
По сути, я не совсем уверен, какой из этих двух методов использовать:
try {
ChargeCreditCard(cardNumber, expDate, hugeAmountOMoney);
} catch(ChargeFailException e) {
// client handles error depending on type of failure as specified by specific type of exception
}
или
var status = TryChargeCreditCard(cardNumber, expDate, hugeAmountOMoney);
if(!status.wasSuccessful) {
// client handles error depending on type of failure as specified in status
}
например. Когда пользователь пытается снять деньги с кредитной карты, действительно ли эта карта отклоняется исключительных обстоятельств? Я спускаюсь слишком далеко в кроличью нору, задавая этот вопрос в первую очередь?