2010-07-04 38 views
6

Tôi muốn sử dụng ngoại lệ tùy chỉnh để có thông báo thân thiện với người dùng xuất hiện khi ngoại lệ xảy ra bất kỳ loại nào.Ngăn chặn ngoại lệ

Cách đơn giản để thực hiện việc này là gì? Có biện pháp phòng ngừa nào khác tôi nên thực hiện để tránh can thiệp vào EDT của Swing không?

Trả lời

6

Exception dịch:

Đó là một ý tưởng tốt để không gây ô nhiễm ứng dụng của bạn với những thông điệp đó không có ý nghĩa cho người dùng cuối, nhưng thay vì tạo Exceptions ý nghĩa và tin nhắn đó sẽ dịch các ngoại lệ/lỗi đã xảy ra ở đâu đó sâu trong việc triển khai ứng dụng của bạn.

Theo nhận xét của @ Romain, bạn có thể sử dụng hàm tạo Exception(Throwable cause) để theo dõi ngoại lệ cấp thấp hơn.

Từ Effective Java 2nd Edition, khoản 61:

[...] lớp cao hơn nên bắt ngoại lệ cấp dưới, và trong nơi của họ, ném ngoại lệ có thể được giải thích trong điều khoản của higher- cấp độ trừu tượng. Thành ngữ này được gọi là dịch ngoại lệ:

// Exception Translation 
    try { 
     // Use lower-level abstraction to do our bidding 
     ... 
    } catch(LowerLevelException e) { 
     throw new HigherLevelException(...); 
    } 
+2

+1 Chỉ cần đảm bảo bạn vượt qua ngoại lệ ban đầu của bạn với hàm tạo mới để bạn có thể xem dấu vết ngăn xếp đầy đủ cũng như nguyên nhân gốc. –

2

Bạn có thể sử dụng java.lang.Thread.UncaughtExceptionHandler mà bắt tất cả các trường hợp ngoại lệ bạn chưa chăm sóc cho chính mình

import java.lang.Thread.UncaughtExceptionHandler; 

    public class MyUncaughtExceptionHandler implements UncaughtExceptionHandler { 

    public void uncaughtException(Thread t, Throwable e) { 
     Frame.showError("Titel", "Description", e, Level.WARNING); 
     e.printStackTrace(); 
    } 
} 

đăng ký nó trong ứng dụng của bạn:

public static void main(String[] args) { 
    Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler()); 
} 

và trong GUI của bạn, bạn có thể sử dụng org.jdesktop.swingx.JXErrorPane từ SwingX để hiển thị popup lỗi đẹp, thông báo cho người dùng về các ngoại lệ.

public static void showError(String title, String desc, Throwable e, 
     Level level) { 
    JXErrorPane.showDialog(this, new ErrorInfo(title, 
      desc, null, null, e, level, null)); 
} 
Các vấn đề liên quan