2012-02-20 33 views
9

Tôi đang cố thu thập đầu vào về cách các lập trình viên Java EE khác thực hiện xử lý ngoại lệ của họ. Bạn có tập trung xử lý lỗi (ví dụ: bộ lọc Servlet) không?Kiến trúc xử lý ngoại lệ cho các dự án Java EE

Bạn có tạo các loại ngoại lệ khác nhau cho các lớp ứng dụng khác nhau (kiên trì, dịch vụ, v.v ...) không?

Bạn có vừa nuốt các ngoại lệ và không vứt bỏ chuỗi đó không?

Các mô hình khác có gì trong kiến ​​trúc xử lý ngoại lệ? Bạn sử dụng cái nào và tại sao?

Trả lời

7

Lớp kiên trì, nếu nó được triển khai bằng cách sử dụng JPA hoặc Hibernate, đã có ngoại lệ riêng, là ngoại lệ thời gian chạy.

Lớp dịch vụ ném ngoại lệ thời gian chạy khi đối số bất hợp pháp được chuyển (khi chúng được xác nhận bởi lớp trình bày) hoặc ngoại lệ được kiểm tra khi xảy ra lỗi khôi phục (ví dụ: tên đã chọn đã tồn tại trong cơ sở dữ liệu).

Mỗi bộ điều khiển của lớp trình bày đề cập đến các ngoại lệ được kiểm tra mà dịch vụ kinh doanh gọi, cung cấp thông báo lỗi có ý nghĩa và cho phép người dùng khôi phục lỗi (ví dụ: hiển thị lại biểu mẫu và yêu cầu người dùng để chọn một tên khác)

Tất cả các ngoại lệ thời gian chạy khác, đến từ lớp trình bày, lớp nghiệp vụ hoặc lớp kiên trì, được xử lý bởi một hoặc nhiều trình xử lý ngoại lệ toàn cục (hầu hết các khung UI hỗ trợ chúng). ngoại lệ và gửi một thông báo lỗi chung chung hơn hoặc ít hơn (ví dụ: "Đã xảy ra lỗi không mong muốn", "Một số người dùng khác đã sửa đổi hoặc xóa đối tượng bạn đã cố sửa đổi").

5

Trường hợp ngoại lệ là vàng nguyên chất để bạn cố gắng tìm hiểu điều gì đã xảy ra. Hãy đối xử với họ cho phù hợp!

Trường hợp ngoại lệ nuốt chỉ được chấp nhận trong một số ít trường hợp, nơi thực sự là hành động thích hợp.

Trường hợp ngoại lệ được kiểm tra trong Java thường buộc bạn phải xem xét cách xử lý các lỗi gần vị trí thực sự xảy ra. Lưu ý rằng nó có thể được chấp nhận hoàn toàn để bọc ngoại lệ trong một DomainException (hoặc một lớp con thích hợp của chúng) và gửi nó lên chuỗi gọi đến một vị trí có thể thực sự xử lý nó và phục hồi một cách duyên dáng.

Trong hầu hết các trường hợp, bạn có nhiều thử thách nhất cho phép bạn nắm bắt tất cả ngoại lệ và xử lý chúng. Đây là lý do tại sao nó rất quan trọng để cung cấp càng nhiều logic (bằng cách gói nó trong một ngoại lệ có ý nghĩa với bạn), do đó, trình xử lý này có thể hành động phù hợp.

Đối với các trường hợp đã biết, hành động thích hợp có thể được thực hiện.

Đối với các trường hợp không xác định, đó là vấn đề thất bại rất lớn, vì bạn có hệ thống của bạn ở trạng thái không mong muốn. Ghi lại nhiều nhất có thể - bởi vì bạn không thể sao chép nó theo cách khác - và nhập một trạng thái thích hợp (thoát, từ chối dịch vụ thêm, hoặc chỉ tiếp tục phù hợp với mô hình của bạn).

1

Tôi mạnh mẽ không khuyến khích thực hành nuốt ngoại lệ. Đây là cách tốt nhất để lãng phí quá nhiều thời gian điều tra nguồn gốc của một vấn đề. Tôi đã có rất nhiều thời điểm wtf khi tôi cuối cùng đã tìm thấy ngoại lệ ẩn trong một mệnh đề bắt trống. Tôi đồng ý với Thorbjørn về thực tế rằng hầu hết thời gian bạn có một lần thử hàng đầu.Bên trong nó tôi thấy mình sử dụng nhiều phương pháp mà có thể ném ngoại lệ, và để tránh lỗi xử lý mã, tôi thích bắt các trường hợp ngoại lệ chỉ trong bắt đầu.
Giới thiệu về số tập trung, tôi tin rằng các tệp nhật ký của bạn phải đủ tập trung.