Ngoại lệ hoặc mã lỗi


12

Chúng tôi đang xây dựng một dịch vụ web (SOAP, .Net) sẽ nói chuyện với (hầu hết) các máy khách gốc (windows, C ++) và chúng tôi đang tự hỏi đâu là cách tốt nhất để giao tiếp lỗi với khách hàng (ví dụ như SomethingBadHappened như dịch vụ đăng nhập không khả dụng hoặc một cái gì đó giống như người dùng không tìm thấy) và không thể quyết định giữa việc ném ngoại lệ cho khách hàng hoặc sử dụng một số loại mô hình mã lỗi để làm như trên.

Những gì bạn muốn xử lý ở phía máy khách: nhận mã lỗi hoặc xử lý ngoại lệ ServerFault có chứa lý do lỗi?
1) Tại sao chúng ta nghĩ ngoại lệ: Bởi vì nó sẽ làm cho mã phía máy chủ thống nhất hơn rất nhiều
2) Tại sao chúng ta nghĩ mã lỗi: Bởi vì chúng tôi nghĩ rằng nó có ý nghĩa hơn từ quan điểm phía máy khách.

Nếu 2) thực sự đúng, có lẽ chúng ta sẽ muốn tìm mã lỗi hơn ngoại lệ? Có phải đó là trường hợp ở đây?

Ngoài ra, câu trả lời có thay đổi nếu chúng ta nói chuyện với khách hàng được quản lý thay vì khách hàng bản địa?


Chỉ cần thêm một chút làm rõ: a) Tôi đang tìm kiếm các thực tiễn tốt nhất ở đây và kinh nghiệm từ phía khách hàng (vì máy khách phức tạp hơn nhiều và chúng tôi muốn xử lý công cụ ở phía máy chủ nếu chúng tôi có thể giữ mã máy khách đơn giản hơn) b) Máy khách chứa rất nhiều mã kế thừa và chúng tôi có thể hoặc không thể sử dụng các ngoại lệ C ++.
Amit Wadhwa

Điều này có thể giúp- www.codeproject.com/KB/cpp/cppexceptionsproetcontra.aspx
Gulshan

Câu trả lời:


8

SOAP có khái niệm về lỗi , bạn có thể chuyển đổi một ngoại lệ thành lỗi ở phía máy chủ và trên proxy máy khách, lỗi lại có thể được chuyển đổi trở lại thành ngoại lệ. Điều này hoạt động rất tốt trong ngăn xếp metro WCF và Java, không thể nhận xét về các máy khách C ++ gốc.

Liên quan đến thực tiễn tốt nhất về SOA xác định một lỗi chung và một vài lỗi cụ thể chỉ khi máy khách cần xử lý một loại lỗi nhất định khác nhau. Không bao giờ gửi theo dõi ngăn xếp ngoại lệ cho khách hàng trong triển khai sản xuất. Điều này là do trên lý thuyết, dấu vết máy chủ không có ý nghĩa đối với máy khách và vì lý do bảo mật. Đăng nhập đầy đủ lỗi và stacktrace trên máy chủ và gửi một tham chiếu duy nhất đến nhật ký lỗi. Trong WCF, tôi sử dụng khối Xử lý ngoại lệ của Microsoft từ Thư viện doanh nghiệp để tạo hướng dẫn và cũng chuyển đổi một ngoại lệ thành lỗi SOAP.

Kiểm tra hướng dẫn tại Microsoft Forms and Practice .


Cảm ơn điều này nghe có vẻ tốt. Bạn có thể cho tôi một liên kết cụ thể hơn trong trang đó không.
Amit Wadhwa

Ngoài ra, những gì về lỗi cấp độ doanh nghiệp như UserNotFound, v.v. thì những lỗi này cũng sẽ được xử lý như trường hợp ngoại lệ
Amit Wadhwa

Trước đây, các dự án chúng tôi không bao giờ sử dụng Ngoại lệ trong mã hoặc Lỗi trong SOAP để truyền đạt các chế độ thất bại hợp pháp / dự kiến. Chúng tôi đã sử dụng mã lỗi và để chúng cho khách hàng quyết định phải làm gì với chúng. Người dùng không tìm thấy không thực sự là một lỗi / ngoại lệ, đây có lẽ phải là một mã trạng thái.
MrLane

4

Gần đây tôi đã thực hiện một dịch vụ web với các thư viện Java 6, có thể báo cáo lại một ngoại lệ cho người gọi (tôi đã không xem xét cách nó được thực hiện tự động).

Khả năng khách hàng cung cấp dấu vết ngăn xếp trong báo cáo lỗi cho nhà phát triển là rất hữu ích (trái ngược với việc lấy dấu thời gian gần đúng và sau đó phải tìm kiếm trong nhật ký của bạn, nếu bạn tình cờ đăng nhập nó).

Vì vậy, nhìn từ quan điểm của nhà phát triển, hãy sử dụng Ngoại lệ.


1
Tôi đồng ý rằng điều này có thể hữu ích trong dogfood và beta, nhưng bạn có thực sự muốn tiết lộ dấu vết ngăn xếp trong nhật ký sự kiện hoặc tệp nhật ký trong sử dụng trong thế giới thực (và tất nhiên tiết lộ nhiều chi tiết về dịch vụ hơn bạn cần / muốn xử lý )
Amit Wadhwa

2
@Amit, hãy tin tôi vào điều này: Nếu bạn gặp phải tình huống đưa ra dấu vết ngăn xếp trong sản xuất, bạn MUỐN theo dõi ngăn xếp!

1
Lợi ích của việc theo dõi ngăn xếp ở phía máy khách là gì, Chúng tôi chắc chắn sẽ ghi lại tất cả các ngoại lệ ở phía máy chủ trước khi chuyển nó cho máy khách.
Amit Wadhwa

Ngoài ra, những gì về lỗi cấp độ doanh nghiệp như UserNotFound, v.v. thì những lỗi này cũng sẽ được xử lý như trường hợp ngoại lệ
Amit Wadhwa

-2

Nếu đó là một dịch vụ web, bạn không thể chính xác khiến máy chủ đưa ra một ngoại lệ sẽ bị bắt bởi máy khách. Tại giao diện, máy chủ của bạn về cơ bản phải trả về một số loại mã lỗi, ngay cả khi đó là một chuỗi có nội dungAn exception occurred. Type %s, message %s, stack trace %s .

Về phía máy khách, bạn có thể yêu cầu mã đọc phản hồi của mình kiểm tra phản hồi để xem nó có lỗi hay không và đưa ra một ngoại lệ ở phía máy khách. Đó là một cách rất tốt để làm điều đó, trong các ngôn ngữ có xử lý ngoại lệ tốt ít nhất. Mặc dù vậy, C ++ không có ngoại lệ tốt, và đó là một ý tưởng tốt để tránh càng xa các ngoại lệ C ++ càng tốt. Nếu bạn không thể sử dụng ngôn ngữ tốt hơn, thì hãy sử dụng mã lỗi.


Tôi đoán ngoại lệ chưa được phát hiện sẽ là ServerFault cho khách hàng
Amit Wadhwa

3
Không có gì sai với các ngoại lệ C ++ hoặc C ++. Có rất nhiều lý do để sử dụng một ngôn ngữ khác ngoài C ++ cho một số dự án nhất định, nhưng xử lý ngoại lệ không phải là một trong số đó.
KeithB

Không chỉ là nó chống lại các thực tiễn tốt nhất về bảo mật: Máy khách chính xác nên làm gì với dấu vết ngăn xếp của máy chủ của bạn? In nó và gửi cho bạn? Gửi dưới dạng email? Sử dụng cho giấy bôi trơn?
JensG

@JensG: Nếu đây là một dịch vụ web chứ không phải trang web , khách hàng phải đủ chuyên nghiệp để gửi email cho bạn dưới dạng báo cáo lỗi.
Mason Wheeler
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.