Tôi đang viết một API kết nối với một dịch vụ hoặc trả về một thông điệp "Thành công" đơn giản hoặc một trong hơn 100 mùi vị khác nhau của sự thất bại.Cách thực hành tốt nhất để chỉ ra rằng yêu cầu máy chủ đã thất bại?
Ban đầu tôi nghĩ viết phương thức gửi yêu cầu đến dịch vụ này sao cho nếu nó thành công thì phương thức trả về không có gì, nhưng nếu nó không thành công vì bất kỳ lý do nào, nó ném một ngoại lệ.
Tôi không quan tâm đến thiết kế này lắm, nhưng mặt khác hôm nay tôi đã đọc "How to Design a Good API and Why it Matters" của Joshua Bloch, nơi ông nói "Vứt bỏ ngoại lệ để chỉ ra điều kiện đặc biệt ... Đừng ép khách hàng sử dụng ngoại lệ cho luồng điều khiển. " (và "Ngược lại, đừng thất bại.")
Mặt khác, tôi nhận thấy rằng HttpWebRequest tôi đang sử dụng dường như ném một ngoại lệ khi yêu cầu không thành công, thay vì trả về một phản hồi chứa " 500 Lỗi máy chủ nội bộ ".
Mẫu tốt nhất để báo cáo lỗi trong trường hợp này là gì? Nếu tôi ném một ngoại lệ đối với mọi yêu cầu không thành công, tôi có phải chịu đau khổ lớn tại một thời điểm nào đó trong tương lai không?
Chỉnh sửa: Cảm ơn bạn rất vui vì đã trả lời cho đến thời điểm này. Một số công cụ xây dựng:
- đó là một DLL sẽ được cung cấp cho khách hàng để tham khảo trong đơn đăng ký của họ.
- một ví dụ tương tự về cách sử dụng sẽ là
ChargeCreditCard(CreditCardInfo i)
- rõ ràng là khi phương thức ChargeCreditCard() không thành công, đó là một thỏa thuận lớn; Tôi chỉ không chắc chắn 100% liệu tôi có nên dừng máy ép hoặc chuyển trách nhiệm đó cho khách hàng hay không.
Sửa lần thứ hai: Về cơ bản Tôi không hoàn toàn thuyết phục nào trong hai phương thức này để sử dụng:
try {
ChargeCreditCard(cardNumber, expDate, hugeAmountOMoney);
} catch(ChargeFailException e) {
// client handles error depending on type of failure as specified by specific type of exception
}
hoặc
var status = TryChargeCreditCard(cardNumber, expDate, hugeAmountOMoney);
if(!status.wasSuccessful) {
// client handles error depending on type of failure as specified in status
}
ví dụ khi người dùng cố gắng tính phí thẻ tín dụng, thẻ có bị từ chối thực sự là một trường hợp đặc biệt đặc biệt không? Tôi đang đi quá xa trong lỗ thỏ bằng cách hỏi câu hỏi này ngay từ đầu?
"Exceptions, trường hợp ngoại lệ, ngoại lệ!" (* Ballmer dance *) –
Đây có phải là REST, hoặc SOAP, hoặc cả hai? –
'WebException' được ném bởi' WebRequest 'GetResponse()' chứa 'WebResponse' nếu nó là _valid_ theo định dạng giao thức. Vì vậy, đối với bạn, nó hoặc là giữ thiết kế của 'BCL' lớp học và xây dựng một cái gì đó tương tự hoặc ... không. Mục tiêu của ứng dụng của bạn là gì? Có cần thiết rằng yêu cầu máy chủ thành công không? Sau đó ném. Hay nó chỉ là tốt đẹp để có dữ liệu bổ sung? – ordag