2015-12-14 17 views
5

Số mặt hàng 6 trong this bài viết tiểu bang:Vứt bỏ cùng một ngoại lệ nếu nó không được xử lý, hoặc xây dựng một ngoại lệ mới?

Cố gắng không ném lại ngoại lệ vì giá. Nếu cần việc ném lại đã là phải, hãy ném lại cùng một ngoại lệ thay vì tạo ngoại lệ mới. Điều này sẽ mang lại hiệu suất bổ sung. Bạn có thể thêm thông tin bổ sung trong mỗi lớp vào ngoại lệ đó.

Vâng, nhưng điều này vi phạm việc tách lớp, phải không?

Hãy nói rằng tôi có một thực hiện cụ thể của DAO mà ném một SQLException

Hãy nói rằng dịch vụ lớp của tôi (hoặc kinh doanh lớp ..) gọi một phương pháp từ DAO lớp, nhưng quyết định không xử lý các ngoại lệ ném.

Nếu tôi ném lại SQLException vào Lớp xem, Lớp xem của tôi sẽ không chỉ được ghép nối với Lớp DAO, phải không?

Không đúng để ném Ngoại lệ mới, để Chế độ xem phụ thuộc chỉ ở cấp độ một lớp bên dưới chứ không phải là hai?

Những lợi thế nào khi ném cùng ngoại lệ mang lại, ngoại trừ hiệu suất?

+0

Phụ thuộc vào cách bạn nắm bắt. Nếu bạn chỉ cần bắt Throwable ở lớp trên cùng và in một dấu vết ngăn xếp và tin nhắn sau đó bạn không vi phạm bất cứ điều gì (cấp trên của bạn chỉ phụ thuộc vào Throwable). Nếu bạn bắt được DAO ngoại lệ cụ thể thì có điều gì đó đang xảy ra. – Pace

+2

Vâng, đó là lời khuyên ngớ ngẩn. Nếu bạn cần phải suy nghĩ lại, hãy ném cái gì đó có ý nghĩa về mặt ngữ nghĩa cho cấp độ api đó, bạn hãy nghe nó có vẻ hoàn toàn hợp lý – pvg

+1

Tôi không thể tưởng tượng được hiệu suất của việc tạo và ném một ngoại lệ mới thay vì một ngoại lệ theo bất kỳ cách thực tế nào. – Kylar

Trả lời

5

Nếu tôi ném lại SQLException vào Lớp xem, Lớp xem của tôi sẽ không chỉ được ghép nối với Lớp DAO phải không?

Điều này hoàn toàn chính xác.

Không đúng để ném Ngoại lệ mới, sao cho Chế độ xem chỉ phụ thuộc vào cấp độ một lớp bên dưới chứ không phải là hai?

Tuyệt đối. Nếu lớp DAO của bạn không thể xử lý các ngoại lệ đến từ SQL, nó sẽ bắt nó, làm cho càng nhiều ý nghĩa của nó càng tốt, và ném ngoại lệ của riêng nó.

Hãy xem xét ví dụ: giả sử lớp DAO của bạn cho phép bạn thêm các mục mới trong đó một thuộc tính nhất định phải là duy nhất. Lớp SQL có thể có một ràng buộc duy nhất hoặc một chỉ mục duy nhất để thực thi ràng buộc này trên lớp RDBMS. Nếu người gọi lớp DAO của bạn cố gắng lưu một đối tượng vi phạm ràng buộc duy nhất, thì ngoại lệ SQL sẽ bị ném.Nếu bạn cho phép ngoại lệ này tuyên truyền cho người gọi, rất có thể là họ sẽ không biết phải làm gì với nó và thậm chí có thể hiển thị cho người dùng cuối:

ORA-00001: ràng buộc duy nhất (UxPatient_rec_soc) vi phạm

Giải pháp này rất xấu, nhưng một giải pháp thay thế để thử và làm cho nó trở nên dễ vỡ hơn.

DAO của bạn nên bắt ngoại lệ, quyết định ý nghĩa của người gọi và ném ngoại lệ của riêng nó. Bằng cách này, bạn sẽ có thể thay đổi cài đặt của mình độc lập với người gọi.

Lưu ý chung: Cân nhắc hiệu suất phải là một trong số ít quan trọng nhất khi quyết định ném/ném lại ngoại lệ, vì ngoại lệ chỉ nên được ném trong các tình huống hiếm có. Độ rõ ràng của giao diện của bạn quan trọng hơn rất nhiều.

3

Tôi đồng ý với bạn về việc ném một ngoại lệ mô tả hơn đối với lớp của bạn gói bản gốc sẽ thuận tiện hơn. SQLException trong trường hợp này có thể là một vấn đề cấp thấp có thể được diễn giải và đưa vào bối cảnh kinh doanh bằng cách ném một ngoại lệ mô tả mới hơn.

Cũng vui lòng xem xét rằng thường thì hiệu suất xử lý lỗi chính nó không phải là điều bạn muốn tối ưu hóa. Vì vậy, nó đúng là ném một ngoại lệ là chậm hơn so với trở về từ phương pháp, nhưng điều này xảy ra chỉ khi một cái gì đó đi sai. (Vì bạn nên tránh sử dụng ngoại lệ để xử lý các luồng chương trình bình thường)

Tôi không thấy bất kỳ lợi thế nào trong việc ném cùng ngoại lệ, trừ khi bạn thực sự không thể thêm bất kỳ thông tin nào bằng cách gói nó. Trong trường hợp đó, đừng làm thế.