2010-04-22 20 views
7

Tôi có một mô-đun plugin đi vào ứng dụng web. Nếu mô-đun không tải chính xác, nó không có ý nghĩa đối với ứng dụng web để tiếp tục và ứng dụng web có thể không tải chút nào, chúng tôi muốn mô-đun này khởi chạy chính xác luôn. Nếu tôi đã ném một ngoại lệ thời gian chạy, nó sẽ nhận được vào các bản ghi, và chỉ bị bỏ qua kể từ khi ứng dụng sẽ tiếp tục anyway, và người dùng cuối sẽ không bao giờ biết ... Tôi biết rằng lỗi có nghĩa là để được ném chỉ dưới điều kiện đặc biệt, và họ thường phải làm với các tình huống mà hệ thống không thể phục hồi, nhưng bạn sẽ làm gì trong tình huống như vậy?Có bao giờ OK để ném một java.lang.Error?

+0

Không được là lỗi, nhưng một số lớp con phù hợp, hiện tại hoặc một lớp bạn xác định. Nhưng việc ném một lớp con của Lỗi là thích hợp trong tình huống của bạn. –

Trả lời

4

Chỉ chỉError mà tôi đã thường xuyên sử dụng trong mã doanh nghiệp là ExceptionInInitializerError. Bạn không còn lựa chọn nào khác trong các khối khởi tạo static.

Nhưng ngay cả khi bạn ném vào bên trong ứng dụng web, ứng dụng web vẫn sẽ tiếp tục nghe trên các yêu cầu HTTP. Đặt cược tốt nhất của bạn là thực hiện việc tải mô-đun hoặc khởi tạo bên trong một số Filter nghe trên url-pattern của /* và để cho các yêu cầu HTTP phù hợp với yêu cầu HTTP. Ví dụ.

private boolean allModulesAreLoaded; 

@Override 
public void init(FilterConfig config) { 
    try { 
     // Load modules. 
     allModulesAreLoaded = true; 
    } catch (Exception e) { 
     // Handle. 
    } 
} 

@Override 
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException { 
    if (allModulesAreLoaded) { 
     chain.doFilter(request, response); 
    } else { 
     throw new ServletException("Not all modules are loaded."); 
    } 
} 

Điều này sẽ mang lại lỗi HTTP 500 với thông báo đã cho.

1

Không chắc chắn chính xác nhưng OSGi có quản lý phụ thuộc của các gói (= tương tự như plugin). Một gói không tải cho đến khi một gói khác sẵn sàng. Có lẽ bạn có thể sử dụng cùng một cơ chế này (hoặc đơn giản là sử dụng OSGi;)) để chờ một plugin/ứng dụng cho đến khi một plugin khác sẵn sàng. Hoặc bạn tắt ứng dụng trong khi khởi động nếu nó không thể tìm/tải đúng plugin của bạn.

+0

Có vẻ như búa của tất cả các móng tay, tuy nhiên thích OSGi, tôi có xu hướng phê duyệt. Bên cạnh đó, bất kỳ loại cơ chế quản lý phụ thuộc nào cũng sẽ hoạt động (IoC, bạn đặt tên nó). – Riduidel

-1

Đăng nhập lỗi và sau đó sử dụng System.Exit để thoát khỏi ứng dụng

+0

Điều đó không cung cấp dấu hiệu nào (ngoài mã trả lại) là lý do ứng dụng bị lỗi. –

+0

@HotLicks Tôi đã thêm một đề xuất để lần đầu tiên đăng nhập lỗi và sau đó thoát. – Demi

Các vấn đề liên quan