2011-09-28 30 views
10

Trước tiên, tôi sẽ nhanh chóng thúc đẩy câu hỏi đó với trường hợp sử dụng của tôi. Thư viện của tôi cần trưng ra một trình phân loại ngoại lệ Java cho một khung công tác mà nó cắm vào. Ví dụ:Chu kỳ trong trường hợp ngoại lệ bị xích

enum Classification { FATAL, TRANSIENT, UNKNOWN } 

Classification classify(Throwable t) { 
    if (t instanceof MyTransientException) 
     return Classification.TRANSIENT; 
    else if (t instanceof MyFatalException) 
     return Classification.FATAL; 
    else 
     return Classification.UNKNOWN; 
} 

Đôi khi, và vì lý do ngoài tầm kiểm soát của tôi, ngoại lệ đã vượt qua là một trình bao bọc xung quanh tôi quan tâm vì vậy tôi muốn tìm kiếm chuỗi nguyên nhân cho nó. Ý tưởng ban đầu của tôi là:

Classification classify(Throwable t) { 
    if (t == null) 
     return Classification.UNKNOWN; 

    if (t instanceof MyTransientException) 
     return Classification.TRANSIENT; 
    else if (t instanceof MyFatalException) 
     return Classification.FATAL; 
    else 
     return classify(t.getCause()); 
} 

Thật không may, điều này có thể dẫn đến việc đệ quy vô hạn nếu ngoại lệ đã qua có chu kỳ trong chuỗi nhân quả của nó. Rất khó có một ngoại lệ như vậy sẽ được thông qua, và một lập luận có thể được thực hiện rằng đó là lỗi ở nơi khác trong hệ thống nếu một ngoại lệ như vậy được tạo ra, nhưng tôi rất không thoải mái với khả năng thư viện của tôi chịu trách nhiệm sản xuất cúp điện nếu nó xảy ra. API của Throwable và javadoc không rõ ràng cấm khả năng này ngoài ý tưởng rằng chu kỳ vốn dĩ vô nghĩa trong một chuỗi nhân quả.

Tôi nhận thấy rằng ổi có phương pháp @Beta để trích xuất chuỗi quan hệ nhân quả, Throwables.getCausalChain, nhưng việc triển khai của nó dễ bị cùng một vấn đề - nó sẽ thổi lên một số OOME.

Tôi định sử dụng identity hash set để phát hiện chu kỳ và giảm thiểu rủi ro, nhưng tôi muốn biết cách người khác xem vấn đề này. Bạn có nghĩ rằng tôi đang quá phòng thủ? Bạn sẽ làm gì?

Trả lời

13

Thật tuyệt khi bạn đang rất tận tâm. Nhưng bạn không muốn tham gia vào việc sản xuất giày kevlar.

Nếu người dùng thực hiện điều gì đó có thể làm cho ngay cả Throwable.printStackTrace đi vào đệ quy vô hạn, người dùng đó không thể trợ giúp. Đừng lo lắng về điều này.

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