Tôi đã đọc lời khuyên về câu hỏi này về cách xử lý một ngoại lệ càng gần nơi nó được nêu ra càng tốt.
Tiến thoái lưỡng nan của tôi trên thực hành tốt nhất là liệu người ta nên sử dụng một try / catch / finally để trả lại một enum (hoặc một int đại diện cho một giá trị, 0 cho lỗi, 1 cho ok, 2 cho cảnh báo vv, tùy từng trường hợp) để một câu trả lời luôn luôn theo thứ tự, hay người ta nên để ngoại lệ đi qua để phần gọi sẽ giải quyết nó?
Từ những gì tôi có thể thu thập, điều này có thể khác nhau tùy theo trường hợp, vì vậy lời khuyên ban đầu có vẻ kỳ quặc.
Ví dụ, trên một dịch vụ web, bạn sẽ luôn muốn trả về trạng thái tất nhiên, vì vậy mọi trường hợp ngoại lệ phải được xử lý tại chỗ, nhưng hãy nói bên trong một chức năng đăng / nhận một số dữ liệu qua http, bạn sẽ muốn ngoại lệ (ví dụ trong trường hợp 404) để chuyển qua cái đã bắn nó. Nếu bạn không, bạn sẽ phải tạo ra một số cách để thông báo cho phần gọi về chất lượng của kết quả (lỗi: 404), cũng như chính kết quả.
Mặc dù có thể thử bắt ngoại lệ 404 bên trong chức năng của trình trợ giúp nhận / đăng dữ liệu, bạn có nên không? Có phải chỉ mình tôi sử dụng một phần nhỏ để biểu thị các trạng thái trong chương trình (và tất nhiên là ghi lại chúng một cách thích hợp), và sau đó sử dụng thông tin này cho mục đích xác thực vệ sinh (xử lý mọi thứ ok / lỗi) bên ngoài?
Cập nhật: Tôi đã mong đợi một ngoại lệ nghiêm trọng / không gây tử vong cho phân loại chính, nhưng tôi không muốn bao gồm điều này để không làm phương hại đến câu trả lời. Hãy để tôi làm rõ những gì câu hỏi là về: Xử lý các ngoại lệ được ném, không ném ngoại lệ. Hiệu ứng mong muốn là gì: Phát hiện lỗi và cố gắng khôi phục từ đó. Nếu không thể phục hồi, hãy cung cấp phản hồi có ý nghĩa nhất.
Một lần nữa, với ví dụ http get / post, câu hỏi là, bạn có nên cung cấp một đối tượng mới mô tả những gì đã xảy ra với người gọi ban đầu không? Nếu người trợ giúp này ở trong thư viện bạn đang sử dụng, bạn có mong muốn nó cung cấp cho bạn mã trạng thái cho hoạt động không, hoặc bạn sẽ đưa nó vào khối thử bắt? Nếu bạn đang thiết kế nó, bạn sẽ cung cấp một mã trạng thái hoặc ném một ngoại lệ và để cho cấp trên dịch nó thành một mã trạng thái / tin nhắn thay thế?
Tóm tắt: Làm thế nào để bạn chọn nếu một đoạn mã thay vì tạo ra một ngoại lệ, trả về mã trạng thái cùng với bất kỳ kết quả nào mà nó có thể mang lại?